统一的垃圾收集器 - 为什么非代和不实现?

统一的垃圾收集器 - 为什么非代和不实现?

问题描述:

我刚读Unity's docs统一的垃圾收集器 - 为什么非代和不实现?

统一的垃圾收集 - 它采用波姆GC算法 - 非代和非压缩。 “非代数”意味着GC在执行收集过程时必须扫描整个堆,并且随着堆扩展,其性能会下降。 “非压缩”意味着内存中的对象不会重新定位以关闭对象之间的间隙。

是否有人知道或假设为什么Unity会使用标准.Net GC代替使用几代和压缩?我做了一些测试,我真的很惊讶,即使是来自LOH的物体在第0代也可能是GC试图用小物体收集它们。

您注意了细节,所以这里有一个你应得的细节故事。

在2008年初,Unity和Mono宣布他们的合作,并且当时Unity授权M​​ono运行时(被开放源代码使用的GPL)以嵌入它。而Boehm GC是当时Mono的主要GC。

时间过去了,默认情况下,Mono 4.x/5.x使用SGen GC和分代/压缩功能。但是,Unity不想再次支付授权。因此,你看到的文件仍然是。

微软在2016年收购了Xamarin,并因此获得了对Mono核心资产的控制权。它重新发布了麻省理工学院下的代码库,因此永远解决了许可问题。 Unity加入了.NET Foundation,并开始与微软/ Xamarin合作,将最新的Mono运行时合并到游戏引擎中。

这项工作仍在进行中,应该很快达到成熟(目前是一项实验性功能)。

顺便说一句,Unity无法使用标准的.NET GC。 Microsoft不会在.NET Framework中开源其GC,而是在.NET Core中开源。 GC与Mono不同,需要更多努力才能嵌入到Unity中。我想这就是为什么Mono 5现在被选中进行整合的原因。也许将来Unity会迁移到.NET Core GC。

一些事件可以在.NET timeline中找到。