最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
ZGC 垃圾收集器的颜色指针和读屏障技术
时间:2026-07-10 10:18:56 编辑:袖梨 来源:一聚教程网
ZGC实现亚毫秒级停顿的核心在于着色指针与读屏障协同:前者将GC状态编码于指针高位实现纳秒级状态判断,后者在每次引用读取时按需修正指针,使标记、迁移、引用更新全部并发完成,仅剩根扫描等极短STW。
ZGC 实现亚毫秒级停顿的核心,就藏在“着色指针”和“读屏障”这两个技术里。它们不靠加快单步操作,而是把原本必须暂停应用线程才能做的事,变成应用线程自己顺手完成的小动作。
着色指针:把状态信息直接“塞进地址里”
传统 GC 把对象是否存活、是否已移动等状态存在对象头中,每次判断都要访问内存。ZGC 反过来,直接利用 64 位指针的高位(比如高 4 位)编码状态,例如:
- Marked0 / Marked1:交替标识对象在本轮 GC 中是否被标记为存活
- Remapped:表示该指针已指向迁移后的新地址
- Finalizable:标记对象等待执行 finalize 方法
这样,检查一个对象的状态只需一次位运算,纳秒级完成;而且状态随指针一起流动,为读屏障提供即时依据。
读屏障:每次读引用时自动“修路”
当代码执行 Object obj = field; 这类操作时,JVM 自动插入轻量读屏障。它会检查指针颜色:
- 如果指针是 Remapped=0 但对象已被迁移,屏障就查转发表(Forwarding Table),拿到新地址
- 当场把旧指针更新为新地址,并返回新引用
- 后续再读这个字段,就是普通指针访问——因为指针已经“自愈”了
整个过程平均耗时不到 100 纳秒,对业务代码完全透明。
两者配合:为什么能几乎不 STW?
着色指针提供快速状态识别能力,读屏障提供按需响应能力,二者协同绕开传统 GC 的两大停顿根源:
- 标记不再需要全局遍历:应用线程访问对象时,读屏障顺手完成标记
- 引用更新不再依赖统一扫描:只在首次访问旧地址时修正,其余时候无需干预
- 对象转移全程并发:GC 线程搬数据,应用线程照常运行,靠指针颜色和屏障保持一致
最终 ZGC 剩下的 STW 阶段仅涉及根集合扫描和少量引用处理,时间只与线程栈、静态变量等根数量相关,和堆大小无关。