zgc读屏障通过染色指针和按需修正实现无stw对象移动:仅拦截堆中引用读取,依据指针高4位状态(marked0/remapped)决定是否查表更新;整理渐进式触发,旧视图保留兜底,引用修正分散在每次读操作中完成。

ZGC 的读屏障不是用来“阻止访问”,而是让每次对象字段读取自动完成引用修正,从而在对象移动过程中对应用线程完全透明。
读屏障只拦截字段读取,不干扰其他操作
它仅插在 getfield、aload 等从堆中加载对象引用的字节码位置,由 JIT 编译器在生成机器码时自动注入。局部变量赋值、方法参数传递、数组索引计算(非引用读取)等都不触发读屏障。这意味着绝大多数代码路径不受影响,只有真正需要从堆里拿引用的地方才做检查。
靠染色指针实现毫秒级内无感修正
ZGC 把状态信息直接编码进 64 位指针高 4 位:Marked0 表示对象正被迁移,Remapped 表示已迁完且引用更新完毕。读屏障拿到指针后,只需一次位运算判断状态:
- 若为 Remapped:直接放行,零开销
- 若为 Marked0:查转发表获取新地址,原子写回原引用位置(如寄存器或栈帧)
- 后续再读同一引用,指针已是新地址,不再进屏障
整理是渐进式按需触发,不是集中搬运
并发整理阶段,ZGC 不会一次性搬空所有 Region。它只选部分区域启动迁移,其余对象仍留在原地。未被访问的对象不挪动;一旦被读取,读屏障立刻触发搬迁+指针更新。旧 Marked 视图保留一段时间,配合指针染色与屏障兜底,确保残留访问仍安全。
没有全局同步点,也不依赖 STW 更新引用
传统 GC 在整理时必须暂停所有线程,等所有引用更新完才能恢复运行。ZGC 把这项工作拆解到亿万次普通读操作中——每次读都可能顺手“自愈”一个引用。整个过程没有等待所有引用就绪的屏障点,也没有 Stop-The-World 阶段来批量修正指针。










