zgc实现超低延迟的核心是将绝大多数gc工作与应用线程并发执行,仅保留极短stw阶段;依托着色指针(元数据嵌入指针高位)、读屏障(引用加载时按需处理标记与重定位)及全并发三阶段(标记、重定位、引用更新),实现毫秒级乃至亚毫秒级停顿。

ZGC 实现超低延迟的核心,是把绝大多数 GC 工作挪到应用线程运行的同时去做,让 STW(Stop-The-World)阶段压缩到毫秒级甚至亚毫秒级。它不靠减少工作量,而是靠重排工作时序和底层硬件协同。
着色指针:元数据藏在指针里
ZGC 不在对象头里存标记位或转发信息,而是直接复用 64 位指针中未被硬件使用的高位(比如 4 个 bit),用来编码对象状态:marked0、marked1、remapped、finalizable。这样,一次内存读就能同时拿到地址和状态,省去了查表、加锁、访问额外元数据结构的开销。对象是否被标记、是否已重定位,都“随指而至”,无需暂停线程去统一扫描或更新。
读屏障:每次取引用时自动“补漏”
每当 Java 代码执行类似 obj.field 这样的引用加载操作,JVM 就会插入一小段读屏障逻辑。它检查指针颜色:如果读到的是 marked 状态但尚未 remapped,就当场完成重定位并更新引用;如果只是未标记,则触发标记逻辑。这个过程由应用线程自己完成,且只影响当前这一次读——不是全局暂停,也不是批量处理,而是“按需即时响应”。这保证了并发标记与并发重定位的一致性,也避免了传统 GC 中为维护一致性而设置的长停顿。
全并发三阶段:标记、重定位、引用更新全部并行
ZGC 摒弃分代,把堆看作整体,整个回收周期分为三个主要阶段,全部支持与用户线程并发:
- 并发标记:用 SATB 快照机制起始,配合读屏障捕获后续引用变更,全程无 STW;
- 再标记(Remark):仅需短暂 STW(通常
- 并发重定位 + 并发引用更新:移动对象、修正所有指向旧地址的引用,全部由 GC 线程和应用线程协作完成,无需全局暂停。
不依赖堆大小:延迟稳定在 10ms 内
ZGC 的停顿时间几乎不随堆从几 GB 到 4TB 变化。因为它的 STW 阶段只做极轻量的事:比如遍历有限的 GC Roots、处理少量待决的弱引用、确认并发阶段收尾。真正耗时的扫描、移动、更新,都分散在并发阶段,摊平到整个运行周期中。所以即使堆达 TB 级,只要 CPU 资源足够,延迟依然可控。











