我知道停止世界,增量,并行,并发,(软/硬)实时垃圾收集器的概念。但我无法理解大多数并发 GC。与并发GC不同吗?有什么不同?为什么它被称为主要是?
答案 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时,他们指的是从指定的“根节点”(通常是程序的寄存器)开始的收集器,并跟随指向每个可到达对象的指针。无法到达的一切都是垃圾。
简而言之,大多数并行收集器并行执行大部分工作,然后暂停程序的执行以更正程序在收集器运行时所做的任何更改。因此,它“大部分是平行的。”