JVM学习笔记23

71 阅读1分钟

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是专用于维护记忆集的的的线程,方法是扫描脏卡队列中的卡片,然后更新这些区域的记忆集。