我认为"分代式垃圾回收"和"增量式垃圾回收"都是加快垃圾回收暂停的不同方法。但是它们之间有什么区别?它们是如何工作的?哪种更适合实时软件/产生较短的暂停时间?
此外,Boehm GC 是其中任何一种吗?
我认为"分代式垃圾回收"和"增量式垃圾回收"都是加快垃圾回收暂停的不同方法。但是它们之间有什么区别?它们是如何工作的?哪种更适合实时软件/产生较短的暂停时间?
此外,Boehm GC 是其中任何一种吗?
一种分代垃圾回收机制始终是增量式的,因为它在一个循环中不会收集所有无法访问的对象。相反,增量式垃圾回收并不一定使用分代方案来决定哪些无法访问的对象需要收集或不需要收集。
一种分代垃圾回收将无法访问的对象大致划分为不同的集合,根据它们的最后使用时间-也就是它们的年龄。基本理论是最近创建的对象很快就会变得无法访问。因此,“年轻”对象所在的集合会在早期进行收集。
增量式垃圾回收可以采用以上的分代方案实现,但是可以采用不同的方法来决定应该清除哪个组的对象。
可能会查看这个维基百科页面及其下方以获取有关两种垃圾回收方法的更多信息。
根据Boehm的网站,他的垃圾回收是增量和分代的:
收集器使用标记-清扫算法。在提供正确类型的虚拟内存支持的操作系统下,它提供增量和分代收集。
就实时环境而言,有几篇学术研究论文描述了进行垃圾回收的新颖巧妙方法:
http://www.memorymanagement.org/glossary/i.html#incremental.garbage.collection
一些追踪垃圾收集算法可以在收集周期中间暂停,而mutator继续运行,而不会出现不一致的数据。这样的收集器可以增量操作,并适用于交互式系统。 原始垃圾收集器(1)一旦开始收集周期,就必须完成任务或放弃到目前为止的所有工作。这通常是一个合适的限制,但在系统必须保证响应时间时是不可接受的;例如,在具有用户界面和实时硬件控制系统的系统中。这样的系统可能使用增量垃圾收集,以便关键时间处理和垃圾收集可以并行有效进行,而不会浪费努力。http://www.memorymanagement.org/glossary/g.html#generational.garbage.collection
分代垃圾收集是利用分代假设的追踪垃圾收集。对象被聚集在不同的代中。新对象分配在最年轻或幼儿代中,如果它们存活下来,则晋升到较旧的代中。较旧代中的对象不经常被判定,节省了CPU时间。 通常情况下,一个对象很少引用一个年轻对象。因此,一个代中的对象通常对年轻代中的对象有很少的引用。这意味着在收集年轻代时扫描老代可以通过记忆集更有效地完成。 在一些纯函数式语言(即没有更新的语言)中,所有引用都是向后的,这种情况下记忆集是不必要的。