【问题标题】:Why are gen1/gen2 collections slower than gen0?为什么 gen1/gen2 收集比 gen0 慢?
【发布时间】:2020-11-06 16:23:37
【问题描述】:

据我所知,短期对象的创建在 GC 方面并不太麻烦 - 这意味着 gen0 集合非常快。然而,Gen1/gen2 集合似乎更“可怕”,即据说通常比 gen0 慢很多。

这是为什么呢?比如说,是什么让 gen2 集合平均比 gen0 慢得多?

我不知道收集方法本身之间有任何结构差异(即在标记/扫描/压缩阶段完成的事情),我是否遗漏了什么?或者仅仅是这样吗? gen2 往往比 gen0 大,因此要检查的对象更多?

【问题讨论】:

    标签: c# garbage-collection


    【解决方案1】:

    为了放大 canton7 的回答,值得指出一些额外的事情,其中​​一个增加了所有集合的成本(尤其是 gen1 和 gen2),但降低了它们之间的分配成本,其中一个降低了gen0 和 gen1 集合的成本:

    1. 许多垃圾收集器的行为有点类似于清理建筑物,将所有有价值的东西移到另一栋建筑物,炸毁原始建筑物,并重建空壳。将事物从 gen0 建筑物移动到 gen1 建筑物的 gen0 集合将相当快,因为​​ gen0“建筑物”中不会有太多东西。一个 gen2 集合将不得不移动更大的 gen2 建筑物中的所有东西。垃圾收集系统可以为较小的第 2 代对象和较大的对象使用单独的建筑物,并通过跟踪可用空间的各个区域来管理较大的建筑物,但是移动较小的对象和回收存储批发比尝试管理所有单独的存储区域要少这将有资格重复使用。然而,这里要观察世代的一个关键点是,即使需要扫描 gen1 或 gen2 对象,也没有必要移动它,因为它所在的“建筑物”不是立即拆除的目标。

    2. 许多系统使用“卡片表”,它可以记录自上次 gen0 或 gen1 集合以来是否已写入每个 4K 内存块,或者是否包含用于修改对象的引用。这会显着减慢对任何此类存储区域的首次写入速度,但在 gen0 和 gen1 收集期间,可以跳过对大量对象的检查。卡表的使用细节各不相同,但基本概念是,如果代码有大量引用,但大部分都落在未标记的 4K 块内,GC 甚至无需查看这些块就可以知道可以通过它们访问的任何较新的对象可以通过其他方式访问,因此可以找到所有 gen0 对象,而无需费心查看这些块。

    请注意,即使是没有卡表的简单垃圾收集系统也可以简单轻松地从分代 GC 原理中受益。例如,在 Commodore 64 BASIC 上,它的垃圾收集器非常慢,一个创建了许多长寿命字符串的程序可以通过使用一对 peek 和 poke 语句来调整字符串顶部来避免冗长的垃圾收集周期——堆指针就在长寿命字符串的底部,因此它们不会被考虑进行重定位/回收。如果一个程序使用数百个将在整个程序执行期间持续存在的字符串(例如,从 00 到 FF 的两位数十六进制字符串表),以及少数其他字符串,这可能会将垃圾收集时间缩短一个数量级以上幅度。

    【讨论】:

      【解决方案2】:

      想到的几个原因:

      1. 它们更大。收集 gen1 意味着也收集 gen0,进行 gen2 收集意味着收集所有三个。较低代的尺寸也较小,因为 gen0 被最频繁地收集,因此需要便宜。
      2. 收集的主要成本是存活对象数量的函数,而不是死亡对象的数量。代际垃圾收集器是围绕代际假设构建的,该假设说对象往往会存活很短的时间,或者很长一段时间,但不经常在中间。根据其定义,Gen0 集合主要由在那一代中死亡的对象组成,因此集合很便宜:gen1 和 gen2 集合具有更高比例的存活对象(gen2 理想情况下应该由幸存的物品),因此更昂贵。
      3. 如果一个对象在 gen0 中,那么它只能被其他 gen0 对象引用,或者被更新为引用它的更高代的对象引用。因此,要查看是否引用了 gen0 中的对象,GC 需要检查其他 gen0 对象,以及只检查那些已更新为指向低代对象的高代对象(GC 跟踪这些对象,请参阅“卡表”)。要查看是否引用了 gen1 对象,需要检查所有 gen0 和 gen1,以及 gen2 中的更新对象。

      【讨论】:

        猜你喜欢
        • 2012-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-30
        • 1970-01-01
        • 2011-03-23
        • 2023-03-25
        • 2013-12-27
        相关资源
        最近更新 更多