"代际垃圾回收"和"增量式垃圾回收"有什么区别?"

29

我认为"分代式垃圾回收"和"增量式垃圾回收"都是加快垃圾回收暂停的不同方法。但是它们之间有什么区别?它们是如何工作的?哪种更适合实时软件/产生较短的暂停时间?

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

3个回答

24

一种分代垃圾回收机制始终是增量式的,因为它在一个循环中不会收集所有无法访问的对象。相反,增量式垃圾回收并不一定使用分代方案来决定哪些无法访问的对象需要收集或不需要收集。

一种分代垃圾回收将无法访问的对象大致划分为不同的集合,根据它们的最后使用时间-也就是它们的年龄。基本理论是最近创建的对象很快就会变得无法访问。因此,“年轻”对象所在的集合会在早期进行收集。

增量式垃圾回收可以采用以上的分代方案实现,但是可以采用不同的方法来决定应该清除哪个组的对象。

可能会查看这个维基百科页面及其下方以获取有关两种垃圾回收方法的更多信息。

根据Boehm的网站,他的垃圾回收是增量和分代的:

收集器使用标记-清扫算法。在提供正确类型的虚拟内存支持的操作系统下,它提供增量和分代收集。

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


19
增量式垃圾回收器是一种能够以增量方式运行的垃圾回收器(这意味着它可以先进行一些工作,然后再进行更多工作,然后再进行更多工作),而不需要在没有中断的情况下运行整个回收过程。与旧的全停顿式垃圾回收器形成对比,例如执行标记&清除操作时,其他代码无法处理对象。但要明确的是:增量式垃圾回收器是否实际上与在同一个对象上执行其他代码的并行运行并不重要,只要它是可以中断的(例如,它必须区分脏对象和干净对象)。 代数式垃圾回收器区分年轻、中等和老年对象。然后可以对新对象(关键字“Eden”)进行复制GC,对老对象进行标记&清除,对中等对象进行不同的处理(取决于实现方式)。根据实现方式,对象的代数之间的区别方式可以是内存中占用的区域或标志。代数式垃圾回收器的挑战在于保持引用从一个代数到另一个代数的对象列表的最新状态。
Boem是一款增量式代数式垃圾回收器,如此处所引述: http://en.wikipedia.org/wiki/Boehm_garbage_collector

年轻一代被分为to-space、from-space和Eden。在from-space和Eden中都进行了分配,在收集时,from-space和Eden都被复制到to-space;不同之处在于,Eden会被完全清除。欲了解更多信息,请参见以下链接并搜索“Eden”:http://java.sun.com/docs/hotspot/gc1.4.2/faq.html - Bernd Elkemann

4

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接