SGen,是一款专门为 Mono 设计的垃圾回收器,SGen 的内存托管堆由三个部分构成:Nursery, Major Heap,Large Object Space(LOS)。SGen 与 Boehm 的主要差异如下:
SGen | Boehm | |
---|---|---|
并发性 | 支持高并发,可以同时进行垃圾收集和应用程序线程的执行。 | 不支持并发执行。 |
内存扫描精度 | 大部分是精确扫描(堆栈和寄存器是保守扫描)。 | 采用保守扫描,所以不能 copy 。 |
内存碎片 | 因为大部分是精确扫描内存,所以可以进行 copy ,减少内存碎片。 | 不能避免内存碎片。 |
内存管理 | 针对 Nursery 年轻代使用复制回收算法,针对 Major Heap 老年代使用标记清除算法。 | 采用基于标记清除的算法。 |
性能 | 采用分代回收,大部分只需处理 Nursery 年轻代的回收,停顿时间比较短,内存使用率比较稳定,帧率也更加稳定。 | 会定期 Stop the world,做全量 GC,内存使用率和帧率都会有上下波动的过程。大部分情况下,两者帧率的差异不大。 |
内存预分配 | 会预先分配大约 40M–50M 的内存,用作 Nursery 和 Major Heap ,同时可能根据对 LOS 的分配需求上涨到 90M 左右。 | 基本不需要。 |
用户可以根据实际场景选择 GC 算法。在内存不敏感的情况下,我们推荐使用 SGen,同时初始内存预分配在 128M 以上,获得更好的性能;在内存敏感的情况下选择 Boehm 。
目前 SGen 仅对小游戏平台适配。
通过 Build Settings -> Player Settings(或者选择菜单栏:Edit -> Project Settings),在 Player -> Other Settings -> Configuration 栏目中找到 GC algorithm 选项,在下拉菜单中选择 SGen 或者 Boehm。