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

时间:2011-03-14 23:47:51

标签: garbage-collection

我正在阅读有关垃圾收集器实现的信息,特别是有关标记和扫描的动态收集器,以及允许mutator在标记阶段未完成时工作的事实(因此避免停止世界)必须使用内存屏障。

因此,例如,如果变换器修改了标记(黑色)对象以指向未标记(白色)对象,则必须将白色对象标记为灰色(标记为活动但尚未扫描)。

但是我找不到任何可以实现的细节:如何检测黑色物体何时被改变并在那一刻执行动作?

2 个答案:

答案 0 :(得分:14)

也许这个令人困惑的术语应该受到指责。垃圾收集术语中的所谓障碍通常是编译器在指针读取和写入之前插入的代码片段。因此,您的程序始终在每次读写之前执行屏障代码。 (您还可以使用虚拟内存保护来获得障碍效果。)

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

有关概述,请参阅http://www.memorymanagement.org/glossary/s.html#strong.tri-color.invariant;有关详情,请参阅this article

答案 1 :(得分:10)

  

我正在阅读有关垃圾收集器实现的信息,特别是有关标记和扫描的动态收集器,以及允许mutator在标记阶段未完成时工作的事实(因此避免停止世界)必须使用内存屏障。

我认为你会混淆写作障碍和记忆障碍。垃圾收集器使用写屏障来跟踪堆的不断变化的拓扑。内存屏障是一种低级并发原语,可防止内存操作被编译器和CPU本身重新排序。

因此,您希望搜索GC写入障碍。特别是Yuasa,Steele和Dijkstra写下障碍。

垃圾收集器还可以使用读取障碍处理堆拓扑的即时突变。