Memory management 什么';分代垃圾收集和增量垃圾收集之间的区别是什么?

Memory management 什么';分代垃圾收集和增量垃圾收集之间的区别是什么?,memory-management,concurrency,garbage-collection,boehm-gc,Memory Management,Concurrency,Garbage Collection,Boehm Gc,我认为(分代和增量)都是加快垃圾收集暂停的不同方法。但代际和增量之间有什么区别?它们是如何工作的?哪一个更适合实时软件/产生更少的长暂停 此外,Boehm GC是其中的任何一种?一代GC始终是增量的,因为它不会在一个周期内收集所有无法访问的对象。相反,增量GC不一定采用生成方案来决定收集或不收集哪些不可访问的对象 分代GC将无法访问的对象划分为不同的集合,大致根据它们最后的用途——可以说是它们的年龄。基本理论是,最近创建的对象将很快变得无法访问。因此,在早期阶段收集包含“年轻”对象的集合 增量G

我认为(分代和增量)都是加快垃圾收集暂停的不同方法。但代际和增量之间有什么区别?它们是如何工作的?哪一个更适合实时软件/产生更少的长暂停


此外,Boehm GC是其中的任何一种?

一代GC始终是增量的,因为它不会在一个周期内收集所有无法访问的对象。相反,增量GC不一定采用生成方案来决定收集或不收集哪些不可访问的对象

分代GC将无法访问的对象划分为不同的集合,大致根据它们最后的用途——可以说是它们的年龄。基本理论是,最近创建的对象将很快变得无法访问。因此,在早期阶段收集包含“年轻”对象的集合

增量GC可以使用上述生成方案实现,但是可以使用不同的方法来决定应该扫描哪一组对象

我们可以查看并进一步向下查看,以获得有关这两种GC方法的更多信息

根据Boehm的网站,他的GC是增量的和分代的:

收集器使用标记扫描 算法。它提供增量和 下的代收 提供 正确的虚拟内存支持

就实时环境而言,有几篇学术研究论文描述了新的、巧妙的垃圾收集方法:

  • 对差异有很好的解释

增量的垃圾收集器是任何可以增量运行的垃圾收集器(这意味着它可以做一些工作,然后再做一些工作,然后再做一些工作),而不必不间断地运行整个收集。这与旧的stop the world垃圾收集器形成对比,后者在没有任何其他代码的情况下对对象进行标记和清理。但需要明确的是:增量垃圾收集器是否实际与在相同对象上执行的其他代码并行运行并不重要,只要它是可中断的(例如,它必须区分脏对象和干净对象)

分代的垃圾收集器区分旧对象、中对象和新对象。然后,它可以在新对象(关键字“Eden”)上复制GC,对旧对象进行标记和扫描,并在介质对象上执行不同的可能性(取决于实现)。根据实现的不同,对象的生成方式可以通过内存中占用的区域或标志来区分。分代GC的挑战是保持从一代到另一代的对象列表是最新的

Boem是一种增量代GC,如下所述:

一些跟踪垃圾收集算法可以在中间暂停 一个收集周期,而变异体继续进行,而不会以 数据不一致。此类收集器可以增量操作,并且 适合在交互式系统中使用

原始垃圾收集器(1),一旦开始收集循环, 要么完成任务,要么放弃目前为止的所有工作。这是 通常是适当的限制,但当系统 必须保证响应时间;例如,在具有用户的系统中 实时硬件控制系统中的接口和接口。此类系统 可能会使用增量垃圾收集,以便 处理和垃圾收集可以在 平行,没有浪费的努力

分代垃圾收集是跟踪 利用世代假设。收集对象 几代人在一起。新对象以最年轻或最年轻的方式分配 如果他们能活下来,就可以晋升到上一代。 旧代中的对象被谴责的频率较低,从而节省了CPU 时间

通常情况下,对象很少引用较年轻的对象。 因此,一代中的对象通常很少引用对象 年轻一代的物品。这意味着扫描旧的 在收集年轻一代的过程中,几代人可以 通过记忆集更有效地完成

在一些纯函数式语言中(即,没有更新),所有 引用在时间上是向后的,在这种情况下,记住的集合是 不必要


Boehm Demers Weiser有一个增量模式,您可以通过调用
GC\u enable\u incremental
来启用该模式。参见

年轻一代被分为《到太空》、《从太空》和《伊甸园》。分配在从空间和伊甸园中进行,从空间和伊甸园都由集合复制到空间;不同的是,伊甸园被彻底清除了。有关更多信息,请查看此处并在页面中搜索Eden: