垃圾回收器的内存屏障实现

14

我正在阅读有关垃圾回收器实现的内容,具体是有关标记-清除的即时垃圾回收器,事实上,在标记阶段未完成时,为了允许mutator工作(从而避免停止整个系统),必须使用内存屏障。

例如,如果mutator修改了一个已标记(黑色)的对象,使其指向一个未标记(白色)的对象,则必须将白色对象标记为灰色(标记为活动但尚未扫描)。

但是我找不到任何详细的说明如何实现这一点:如何检测到黑色对象的更改并在那时执行操作?

2个回答

16

也许混淆的术语有些责任在内。在垃圾回收术语中,所谓的屏障通常是编译器在指针读取和写入之前插入的一小段代码。因此,您的程序在每次读写之前总是执行屏障代码。(您还可以使用虚拟内存保护来获得屏障效果。)

为了维持您所提到的三色不变性,收集器在写入对象之前检查其颜色。在这种情况下,写屏障可以在将黑色对象更改为灰色对象之前执行某些操作。

请参见此概述,以及本文以获取更多详细信息。


但是像 Boehm GC 这样的收集器是如何工作的呢?它不能插入代码,因为它是在使用例如 GCC 编译的普通 C 程序上运行的。我曾经在某个地方读到它使用了内存屏障。 - Damian
没错,Boehm收集器使用VM保护来实现屏障 - 如果我的括号注释让你感到困惑,我很抱歉。 - EmeryBerger

10
我正在阅读有关垃圾收集器实现的文章,特别是有关标记-清除的即时收集器的内容,并且事实上,在标记阶段尚未完成(因此避免停止整个程序)时允许mutators(译注:指能够改变被管理内存区域状态的代码段)工作必须使用内存屏障。
我认为您可能将写入屏障和内存屏障混淆了。垃圾回收器使用写入屏障来跟踪堆的变化拓扑。内存屏障是一种低级并发原语,可以防止内存操作被重新排序,无论是编译器还是CPU本身。
因此您需要搜索GC写入屏障,特别是Yuasa、Steele和Dijkstra的写入屏障。
垃圾收集器也可以使用读取屏障来处理内存区域拓扑的即时变化。

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