Version: 1.3
语言 : 中文
.NET 8
代码调试支持

SGen GC算法

SGen, 是一款专门为Mono设计的垃圾回收器,SGen的内存托管堆由三个部分构成:Nursery, Major Heap, Large Object Space(LOS)。SGen与Boehm的主要差异如下:

  1. 并发性:SGen支持高并发,可以同时进行垃圾收集和应用程序线程的执行,而Boehm GC则不支持并发执行。

  2. 内存扫描精度:SGen大部分是精确扫描(堆栈和寄存器是保守扫描),Boehm采用的是保守扫描,所以不能copy。

  3. 内存碎片:因为SGen大部分是精确扫描内存,所以可以进行copy,减少内存碎片,而Boehm不能避免内存碎片。

  4. 内存管理:SGen针对Nursery年轻代使用的是复制回收算法,针对Major Heap老年代使用的是标记清除算法,Boehm是采用基于标记清除的算法。

  5. 性能:SGen采用分代回收,大部分只需处理Nursery年轻代的回收,停顿时间比较短,内存使用率比较稳定,帧率也更加稳定;Boehm GC会定期Stop the world, 做全量GC,内存使用率和帧率都会有上下波动的过程。大部分情况下,两者帧率的差异不大。

  6. 内存预分配:SGen会预先分配大约40M–50M的内存,用作Nursery和Major Heap,同时可能根据对LOS的分配需求上涨到90M左右;而Boehm基本不需要。

用户可以根据实际场景选择GC算法。在内存不敏感的情况下,我们推荐使用SGen,同时初始内存预分配在128M以上,获得更好的性能;在内存敏感的情况下选择Boehm。目前SGen仅对微信小游戏平台适配。

在Editor中选择GC算法

在Build Settings窗口中点击Player Settings(或者选择菜单栏:Edit > Project Settings),在Player > Other Settings > Configuration栏目中找到GC algorithm选项,在下拉菜单中选择SGen或者Boehm。

.NET 8
代码调试支持