世代和增量垃圾收集有什么区别?

时间:2011-02-23 14:23:25

标签: memory-management concurrency garbage-collection boehm-gc

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

另外,Boehm GC就是其中之一吗?

3 个答案:

答案 0 :(得分:21)

世代GC始终是增量式的,因为它不会在循环期间收集所有无法访问的对象。相反,增量GC不一定采用生成方案来决定要收集哪些无法访问的对象。

世代GC将无法到达的对象划分为不同的集合,大致根据他们的最后用途 - 他们的年龄,可以这么说。基本理论是最近创建的对象很快就会无法访问。因此,在早期收集带有“年轻”物品的装置。

增量GC 可以用上面的代数方案实现,但是可以采用不同的方法来决定应该对哪组对象进行渲染。

有关两种GC方法的更多信息,可以查看this wikipedia page并进一步向下看。

根据Boehm的网站,他的GC是渐进的和世代的:

  

收藏家使用标记扫描   算法。它提供增量和   世代收藏   提供的操作系统   正确的虚拟内存支持。

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

答案 1 :(得分:17)

增量垃圾收集器是任何可以递增运行的垃圾收集器(意味着它可以做一些工作,然后再做一些工作,然后再做一些工作),而不是必须运行整个收藏不间断。这与旧的世界末日垃圾收集者形成鲜明对比。标记和扫描没有任何其他代码能够处理对象。但需要明确的是:增量垃圾收集器是否实际并行运行 与在同一对象上执行的其他代码并不重要,只要它是可中断的(为此它必须区分脏和干净)对象)。

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

Boem是增量代际GC,如下所述:http://en.wikipedia.org/wiki/Boehm_garbage_collector

答案 2 :(得分:3)

http://www.memorymanagement.org/glossary/i.html#incremental.garbage.collection

  

一些跟踪垃圾收集算法可以在中间暂停   一个收集周期,而mutator继续,而没有结束   不一致的数据。这样的收集器可以递增地运行   适用于交互式系统。

     

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

http://www.memorymanagement.org/glossary/g.html#generational.garbage.collection

  

分代垃圾收集正在跟踪垃圾收集   利用世代假设。收集对象   几代人在一起。新对象分配在最年轻的或   苗圃的产生,如果它们存活,就会被提升到老一代。   老一代中的对象受到较少的谴责,从而节省了CPU   时间。

     

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

     

在一些纯功能语言中(即没有更新),全部   引用是及时的,在这种情况下,记忆集是   不必要的。

Boehm-Demers-Weiser有一种增量模式,您可以通过调用GC_enable_incremental启用该模式。见http://www.hpl.hp.com/personal/Hans_Boehm/gc/gcinterface.html