“mostly-concurrent垃圾收集器”是什么?

9

我知道停止-全局、增量、并行、并发、(软/硬)实时垃圾收集器的概念。但我不理解大多数情况下并发的GC。它和并发GC有什么不同?为什么它被称为大多数情况下

2个回答

7
我知道停止-全局暂停、增量、并行、并发、(软/硬)实时垃圾收集器的概念。但我不理解“mostly-concurrent”GC。它和并发GC有什么不同?为什么叫做“mostly”?
像许多其他主题一样,垃圾收集被术语模糊性所笼罩。Boehm因使用非传统方式的传统术语而尤其臭名昭著,但我们应该原谅他,因为他在传统意义还未定型的时候开创了这个领域!:-)
据我所知,“stop-the-world” GC是指在整个GC周期内暂停所有mutator线程的算法,例如,在标记整个堆时。例如,.NET Server GC就是这样做的,因此产生了巨大的300ms暂停时间。增量GC在每个minor GC周期中执行少量的major GC工作,例如OCaml的GC中的“major slices”。并行意味着GC使用多个线程加速垃圾回收过程。并发GC意味着GC与mutators同时运行,例如.NET工作站GC。实时很难定义,最初表示有界最大暂停时间,但现在也表示最小mutator利用率(MMU),以避免GC永远不会长时间暂停mutator而从不允许其运行的病态问题!根据Richard Jones的新书,即时GC永远不会同时暂停多个mutator(即不存在“stop-the-world”阶段),尽管我怀疑他是指mutator独立地挂起。最后,“mostly-concurrent” GC是一种同时暂停所有mutator线程但仅短暂时间而不是任意长的GC周期的GC。因此,在GC运行时mutators大部分时间可以自由运行,因此被称为“mostly concurrent” GC。
“mostly concurrent”的分类很重要,因为大多数(全部?)主要GC都属于此类别,因为它提供了暂停时间和吞吐量之间的良好平衡。例如,.NET工作站GC在获取全局根快照时暂停所有mutator线程,但在标记和清除时恢复它们。

2
在论文"Mostly Parallel Garbage Collection"中,Bohem、Demers和Shenker(ACM SIGPLAN '91编程语言设计与实现会议论文集,SIGPLAN Notices 26, 6(1991年6月),第157-164页)提供了一个易于理解的描述。
他们写道:
假设我们能够维护一组虚拟的脏位,这些位在相应的虚拟内存页被写入时自动设置。(可以通过写保护页面并捕获结果的写错误来获得此功能的可接受实现,而不需要修改底层操作系统内核;当然,在操作系统内核中实现会更有效率。)对于任何定义为停止-全局操作的跟踪收集器,请考虑以下收集算法。在收集开始时,清除所有虚拟脏位。与变异体同时执行传统的跟踪操作。虚拟脏位将被更新以反映变异体的写入。跟踪完成后,停止全局并从所有标记的对象上的脏页进行跟踪。(寄存器被视为脏的。)此时,所有可达对象都已标记,垃圾可以安全回收。
在此算法中,并行跟踪阶段提供了真正可达集合的近似值。这个并行跟踪过程未标记的唯一对象是确实可达的,必须从已经被跟踪后被写入的标记对象中可达。停止全局跟踪阶段从所有这样的对象进行跟踪,以便最终没有真正可达的对象保持未标记。
当他们提到追踪垃圾收集器时,他们指的是从指定的“根节点”(通常是程序的寄存器)开始,并跟随指针到达每个可达对象的收集器。所有不可达的内容都是垃圾。
简而言之,大多数并行收集器在并行执行大部分工作后,会停止程序的执行以纠正收集器运行期间程序所做的任何更改。因此,它是“大多数并行的”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接