Dam*_*ian 13 garbage-collection
我正在阅读有关垃圾收集器实现的内容,特别是有关标记和扫描的动态收集器,以及允许mutator在标记阶段未完成时工作(因此避免停止世界)的事实必须使用屏障.
因此,例如,如果变换器修改了标记的(黑色)对象以指向未标记的(白色)对象,则必须将白色对象标记为灰色(标记为活动但尚未扫描).
但是我找不到任何可以实现的细节:如何检测黑色物体何时被改变并在那一刻执行动作?
Eme*_*ger 14
也许令人困惑的术语是罪魁祸首.垃圾收集术语中的所谓障碍通常是编译器在指针读取和写入之前插入的代码片段.因此,您的程序始终在每次读写之前执行屏障代码.(您还可以使用虚拟内存保护来获得障碍效果.)
为了保持你提到的三色不变量,收集器在写入之前检查对象的颜色.在这种情况下,只要将黑色对象改变为灰色对象,写屏障就可以执行某些动作.
有关概述,请参阅http://www.memorymanagement.org/glossary/s.html#strong.tri-color.invariant,有关详细信息,请参阅本文.
Jon*_*rop 10
我正在阅读有关垃圾收集器实现的内容,特别是有关标记和扫描的动态收集器,以及允许mutator在标记阶段未完成时工作(因此避免停止世界)的事实必须使用屏障.
我认为你会混淆写作障碍和记忆障碍.垃圾收集器使用写屏障来跟踪堆的不断变化的拓扑.内存屏障是一种低级并发原语,可防止内存操作被编译器和CPU本身重新排序.
所以你想要搜索GC写入障碍.尤其是Yuasa,Steele和Dijkstra写下障碍.
垃圾收集器还可以使用读取障碍处理堆拓扑的即时突变.