2011-02-23 44 views
22

我认为(代人和增量)都是使垃圾收集更快停顿的不同方法。但是代际和增量之间有什么区别?他们如何工作?对于实时软件来说更好一些/产生较少的长时间停顿?分代和增量垃圾收集有什么区别?

另外,Boehm GC是其中的哪一个?

回答

20

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

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

增量GC 可能可以用上面的分代方案来实现,但是可以采用不同的方法来决定哪一组对象应该被扫描。

有人可能会看this wikipedia page和进一步向下,欲了解更多有关两种GC方法的信息。

据贝姆的网站,他的GC是增量和代:

收集器使用标记 - 清除 算法。它提供 增量和 世代收集根据 操作系统提供 正确类型的虚拟内存支持。

至于实时环境而言,有几个学术研究论文描述了新的和巧妙的方法来做到垃圾收集:

17

增量垃圾收集器的任何垃圾收集器可以增量运行(这意味着它可以做一些工作,然后一些更多的工作,然后一些更多的工作),而不必运行整个集合不中断。这与旧式的停止世界的垃圾收集器形成对比,例如,一个标记&扫描没有任何其他代码能够在对象上工作。但是要清楚的是:增量垃圾收集器是否实际上并行地运行对于在相同对象上执行的其他代码是不重要的,只要它是可中断的(为此它必须例如区分脏和干净的对象)。

A generation垃圾收集器区分旧的,中等的和新的对象。然后,它可以将GC复制到新对象(关键字“Eden”)上,为旧对象标记&,并在介质对象上标记不同的可能性(取决于实现)。取决于实施方式,区分各代对象的方式是通过区域在内存中占用或通过标志进行区分。 GC代代相传的挑战是保持最新一代引用的对象列表。

Boem是这里举了一个增量代GC:http://en.wikipedia.org/wiki/Boehm_garbage_collector

+0

这是什么伊甸园? – kingsmasher1 2011-09-30 08:59:57

+0

年轻一代分为空间,空间和伊甸园。分配工作在空间和伊甸园都完成,收集的空间和伊甸园都被复制到了空间;不同的是,伊甸园被彻底清除了。欲了解更多信息,请点击此处查找伊甸园页面:http://java.sun.com/docs/hotspot/gc1.4.2/faq.html – 2011-09-30 13:38:50

3

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

一些跟踪垃圾收集算法可以在 中间暂停收集周期,而突变仍在继续,而不会结束了 数据不一致。这些收集器可以递增地操作,并且适用于交互式系统。

原始垃圾收集器(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