我认为(分代和增量)都是使垃圾收集暂停更快的不同方法。但是代际和增量之间有什么区别?它们是如何工作的?哪个更适合实时软件/产生更少的长时间停顿?
此外,Boehm GC 是其中之一吗?
我认为(分代和增量)都是使垃圾收集暂停更快的不同方法。但是代际和增量之间有什么区别?它们是如何工作的?哪个更适合实时软件/产生更少的长时间停顿?
此外,Boehm GC 是其中之一吗?
分代 GC 始终是增量的,因为它不会在一个周期内收集所有无法访问的对象。相反,增量 GC 不一定采用生成方案来决定收集或不收集哪些无法访问的对象。
分代 GC 将无法访问的对象分成不同的集合,大致根据它们的最后用途——可以说是它们的年龄。基本理论是,最近创建的对象会很快变得无法访问。因此,带有“年轻”对象的集合是在早期阶段收集的。
可以使用上述分代方案实现增量 GC ,但可以采用不同的方法来决定应该扫描哪组对象。
可以查看此 wikipedia 页面并进一步向下查看,以获取有关这两种 GC 方法的更多信息。
根据 Boehm 的网站,他的 GC 是增量的和分代的:
收集器使用标记扫描算法。它在提供正确类型的虚拟内存支持的操作系统下提供增量和分代收集。
就实时环境而言,有几篇学术研究论文描述了进行垃圾收集的新颖而巧妙的方法:
增量垃圾收集器是可以增量运行的任何垃圾收集器(这意味着它可以做一点工作,然后做更多工作,然后再做一些工作),而不是必须不间断地运行整个收集。这与旧式的 stop-the-world 垃圾收集器形成鲜明对比,后者在没有任何其他代码能够处理对象的情况下进行例如标记和清除。但要明确:增量垃圾收集器是否实际上与在相同对象上执行的其他代码并行运行并不重要,只要它是可中断的(例如,它必须区分脏对象和干净对象)。
分代垃圾收集器区分旧对象、中对象和新对象。然后它可以对新对象(关键字“Eden”)进行复制 GC,对旧对象进行标记和清除,并在介质对象上执行不同的可能性(取决于实现)。根据实现,区分对象世代的方式是通过内存中占用的区域或标志。分代 GC 的挑战是保持从一代到另一代的对象列表是最新的。
Boem 是这里引用的增量分代 GC:http ://en.wikipedia.org/wiki/Boehm_garbage_collector
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