ZGC 的停顿时间稳定可预测,因其 STW 阶段仅依赖 GC Roots 规模,与堆大小、对象数量无关;并发标记、转移、重定位全程与应用线程并行,结合染色指针与读屏障保障一致性;默认适配 CPU 核心数,无分代设计,避免突发 Full GC;吞吐损耗≤15%,延迟曲线平坦,SLA 可控性强。

ZGC 的并发收集性能之所以稳定且可预测,核心在于它把停顿时间与堆大小、对象数量、活跃度这些变量解耦了。它的 STW 阶段只做三件事:初始标记(扫描 GC Roots)、再标记(处理并发期间的变动)、初始转移(选几个页面启动重定位)。这三步加起来通常不到 1ms,而且耗时基本只取决于 GC Roots 的规模——比如线程栈、静态变量、JNI 引用这些,跟堆里有 10GB 还是 1TB 活跃对象关系不大。
并发阶段全程不依赖堆规模
ZGC 的标记、转移、重定位全部在应用线程运行的同时并发执行。它靠染色指针和读屏障来保证一致性,不需要全局暂停来“冻结”对象图。这意味着即使堆从 16GB 扩到 512GB,只要 GC Roots 数量不变,最大停顿几乎不变。实测中,在 256GB 堆上 ZGC 的 STW 仍稳定在 1.3ms 左右,波动极小。
自动适配资源,减少人为扰动
ZGC 默认使用与 CPU 核心数相等的并发线程数,并能根据系统负载动态调整。它不强制划分年轻代/老年代,避免了分代回收中因晋升风暴或幸存者区溢出引发的不可控暂停。也没有“混合回收”或“并发模式失败”这类 G1 中常见的突发性 Full GC 风险。整个周期节奏平滑,GC 日志里 pause 时间的标准差通常只有几十微秒。
内存布局与屏障机制保障一致性
ZGC 把堆划分为固定大小的页面(page),每个页面独立管理;配合读屏障,在对象被访问的瞬间完成重定位指针更新。这种设计让并发操作细粒度、局部化,不会因某块内存热点导致全局阻塞。再加上 NUMA 感知分配和多映射内存支持,进一步压缩了跨节点访问延迟,使性能表现更贴近硬件实际能力。
这种稳定性不是靠牺牲吞吐换来的——ZGC 吞吐损耗控制在 15% 以内,和 G1 相当,但延迟曲线更平坦、更易建模。对 SLA 要求严格的系统来说,可预测比“平均低”更重要,而 ZGC 正是为此而生。


















