zgc的核心是几乎全程并发、仅三次微秒级暂停,依托染色指针、三视图切换、页面粒度回收和无分代设计实现低延迟。

ZGC 的并发处理能力核心在于“几乎全程不暂停应用线程”,它把传统 GC 中必须 STW(Stop-The-World)的重活——标记、转移、重映射——全部搬到与业务线程并行执行,仅保留极短的三次同步暂停(初始标记、最终标记、重映射),每次通常低于 200 微秒。
染色指针:并发状态管理的底层基石
ZGC 不依赖额外的标记位数组或外部元数据表,而是直接复用 64 位指针的高位(如第 41–47 位)编码对象状态(Marked0/Marked1/Remapped/Finalizable)。这使得任意线程在读取对象引用时,能瞬间识别其当前视图状态,无需查表或加锁。
- 应用线程访问对象前自动触发 Load Barrier,若指针处于 Marked 状态,屏障会透明地将其重定向到新地址并更新指针
- GC 线程修改对象位置时,只需原子更新指针值,无需遍历所有引用链——屏障机制保障了后续访问自动“自愈”
- 避免了传统 GC 中“写屏障+卡表+并发修正”的复杂协作链,大幅降低并发冲突和内存屏障开销
三视图切换:保障并发标记与转移的一致性
ZGC 通过全局地址视图切换(Remapped → M0/M1 → Remapped)实现逻辑快照与增量更新的统一。M0 和 M1 并非同时启用,而是交替使用,用于区分不同 GC 周期的标记结果。
- 标记阶段切到 M0 视图:所有新发现的活跃对象指针被“染色”为 M0;未被标记的对象仍保持 Remapped
- 转移阶段切回 Remapped 视图:GC 线程将 M0 对象复制到新页,并将原地址指针批量更新为 Remapped + 新地址
- M0/M1 轮换机制防止跨周期误判——上一轮标记残留的 M0 指针在本轮标记开始前已被清空或忽略
页面粒度回收:可控并发与资源隔离
ZGC 将堆划分为固定大小的页面(page),每个页面独立参与 GC 生命周期。这带来两个关键优势:
- GC 工作可按需调度:只对垃圾比例高、内存压力大的页面启动转移,避免全堆扫描和搬运
- 并发安全边界清晰:一个页面的转移操作不影响其他页面的读写,天然规避跨页引用一致性难题
- 配合 NUMA 感知分配,可将页面绑定到本地内存节点,减少跨节点访问延迟
无分代设计:简化并发逻辑,代价是全堆扫描
ZGC 放弃新生代/老年代划分,每轮 GC 都并发遍历整个堆。这看似低效,实则换来了更稳定的停顿模型:
- 无需维护跨代引用卡表(Card Table),省去写屏障记录和后续扫描开销
- 避免 G1 中 Mixed GC 的复杂触发逻辑与预测误差,STW 时间不再受存活对象分布波动影响
- 全堆标记由多线程并发完成,耗时随 CPU 核数线性下降,而非堆大小增长











