我认为两者(分代和增量)是使垃圾收集暂停更快的不同方法。但是世代和增量之间有什么区别?他们是如何工作的?哪一个更适合实时软件/产生较少的长时间暂停?
另外,Boehm GC就是其中之一吗?
答案 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