GC算法之G1-PART VIII
G1 GC 采用了写前屏障和写后屏障。
任何引用的修改都会触发写后屏障。
G1 GC 会做最少的工作来确定引用更新是否是跨区域更新,因为跨区域引用更新需要在拥有区域的 RSet 中捕获(应在引用指向的对象所在的区域的RSet中记录)。
一旦引用修改被确定为跨区域更新时,G1 GC 会将相应的卡片放入称为“更新日志缓冲区(update log buffer)”或“脏卡队列(dirty card queue)”的缓冲区中。
例子:
object.field = some_other_object;
(个人理解)如果object所在的区域与some_other_object所在的区域是不同区域时,包含object的卡片会被放入脏卡队列中,some_other_object所在区域的RSet中会记录object对它的引用。
concurrent refinement threads是专用于维护记忆集的的的线程,方法是扫描脏卡队列中的卡片,然后更新这些区域的记忆集。