什么是“大多数并发垃圾收集器”?

时间:2011-06-23 12:45:08

标签: garbage-collection concurrent-collections

我知道停止世界,增量,并行,并发,(软/硬)实时垃圾收集器的概念。但我无法理解大多数并发 GC。与并发GC不同吗?有什么不同?为什么它被称为主要是

2 个答案:

答案 0 :(得分:7)

  

我知道停止世界,增量,并行,并发,(软/硬)实时垃圾收集器的概念。但我无法理解大多数并发GC。与并发GC不同吗?有什么不同?为什么它主要被称为?

与许多其他主题一样,垃圾收集笼罩在术语含糊不清的迷雾中。 Boehm以非传统方式使用传统术语特别臭名昭着,但我们应该原谅他,因为他在传统意义尚未僵化的时候开拓了这个领域! : - )

据我了解,stop-the-world GC是指在GC循环的整个持续时间内暂停所有mutator线程的算法,例如,标记整个堆时。例如,.NET Server GC会执行此操作,因此会产生大约300ms的暂停时间。增量GC在每个次要GC循环中执行一些主要的GC工作,例如, OCaml GC中的“主要切片”。并行意味着GC使用多个线程来加速收集垃圾的过程。并发GC意味着GC与突变体同时运行,例如, .NET工作站GC。实时很难定义,最初意味着有限的最大暂停时间,但现在也意味着最小的mutator利用率(MMU),以避免GC从不允许它运行永远不会暂停mutator的病理问题!根据理查德琼斯的新书,动态GC一次不会暂停一个以上的变异器(即没有世界停止阶段),尽管我怀疑他的意思是变异器彼此独立地悬挂。最后,一个主要并发的GC是一个同时暂停所有mutator线程的GC,但只是在很短的时间内暂停,而不是任意长的GC循环。因此,允许mutator在GC运行时大部分时间自由运行,因此称为“大多数并发”GC。

“大部分并发”的分类很重要,因为大多数(所有?)主要GC都归入此类别,因为它在暂停时间和吞吐量之间提供了良好的平衡。例如,.NET工作站GC在获取全局根的快照时挂起所有mutator线程,但在标记和扫描时恢复它们。

答案 1 :(得分:2)

您可以在Bohem,Demers和Shenker的论文"Mostly Parallel Garbage Collection"中找到一个可访问的描述(ACM SIGPLAN '91会议编程语言设计和实现,SIGPLAN Notices 26,6(1991年6月), pp.157-164)。

他们写道:

  

假设我们能够维护一组虚拟脏位,即   每当虚拟内存的相应页面自动设置   写到。 (此功能的可接受实现可以是   通过写保护页面并捕获结果写入获得   故障,没有对底层操作系统内核的修改;一个   OS内核中的实现当然会更有效。)   对于为停止世界操作定义的任何跟踪收集器,   考虑以下收集算法。在开始时   收集,清除所有虚拟脏位。执行传统   与mutator并行跟踪操作。虚拟脏位   将更新以反映mutator写入。跟踪之后   完成,停止世界并追踪所有标记的物体   脏页面。 (寄存器被认为是脏的。)此时,所有   标记可到达的对象,可以安全地回收垃圾。

     

...

     

在该算法中,并行跟踪阶段提供了一个   近似于真实的可达集合。唯一没有标记的对象   这种并行跟踪过程确实可以到达   可以从已经写过的标记对象到达   跟踪。世界上的世界追踪阶段追踪所有这些物体,   所以最终没有真正可达的物体没有标记。

当他们引用tracing garbage collectors时,他们指的是从指定的“根节点”(通常是程序的寄存器)开始的收集器,并跟随指向每个可到达对象的指针。无法到达的一切都是垃圾。

简而言之,大多数并行收集器并行执行大部分工作,然后暂停程序的执行以更正程序在收集器运行时所做的任何更改。因此,它“大部分是平行的。”