zgc是java 11引入的低延迟垃圾收集器,专为tb级大堆设计,可将gc暂停稳定控制在10ms以内且基本不随堆增大而上升;需jdk 15+、-xx:+usezgc、-xms=-xmx,并结合并发线程数、对象分配特征与日志监控调优。

ZGC(Z Garbage Collector)是 Java 11 引入的低延迟垃圾收集器,专为超大堆(TB 级)设计,能将 GC 暂停时间稳定控制在 10ms 以内,且几乎不随堆大小增长。它不依赖于堆内存大小做停顿预测,适合对响应延迟敏感、堆内存动辄数百 GB 甚至数 TB 的服务场景(如实时风控、大型缓存、内存数据库等)。
启用 ZGC 的基本配置
ZGC 是实验性收集器(Java 11–15),从 Java 15 开始成为正式特性(无需额外开启实验标志)。启动时只需指定 JVM 参数:
- -XX:+UseZGC:启用 ZGC(Java 15+ 必需;Java 11–14 还需加 -XX:+UnlockExperimentalVMOptions)
-
-Xmx
:建议设为物理内存的 70%–80%,ZGC 对大堆支持良好,例如 -Xmx800g 或 -Xmx2t - -XX:+ZGenerational(Java 21+ 推荐):启用分代 ZGC,提升吞吐与延迟平衡性(默认关闭)
关键调优与注意事项
ZGC 自动管理大部分行为,但以下几点直接影响稳定性与性能:
- 避免频繁元空间/直接内存泄漏:ZGC 不回收元空间(Metaspace)和直接内存(DirectByteBuffer),这些区域仍由其他机制管理,泄漏会导致 OOM 而不触发 ZGC 回收
-
合理设置并发线程数:ZGC 默认使用
min(ConcGCThreads, #CPUs/4),若 CPU 密集型应用可显式设 -XX:ConcGCThreads=N(通常 N ≤ CPU 核数的 1/2) -
监控 ZGC 日志:启用 -Xlog:gc*:gc.log:time,tags,level,重点关注
Pause(STW 阶段)、Relocate(对象重定位)和Garbage(实际回收量)事件
典型问题排查方向
当 ZGC 表现异常(如暂停突增、内存持续上涨、Full GC 触发)时,优先检查:
-
是否混用其他 GC 参数:如同时指定
-XX:+UseG1GC或-XX:+UseParallelGC,JVM 会忽略 ZGC 并报错或退回到默认 GC - 是否存在大量 finalizer 或 Cleaner 对象:ZGC 不处理 finalization 队列,这类对象会滞留到下一次 GC 周期末尾,拖慢整体进度
-
操作系统限制:Linux 下需确保
/proc/sys/vm/max_map_count足够高(ZGC 每个堆区域映射一个虚拟地址段,TB 堆可能需要数百万 mmap 区域)
对比 G1/Parallel 的适用边界
ZGC 不是“万能升级”,其优势集中在特定场景:
- 堆 ≥ 64GB 且要求 STW :G1 在百 GB 堆上暂停常达 100ms+,ZGC 更稳
- 写多读少、对象生命周期较短:ZGC 重定位开销低,适合高分配率场景
- 不追求极致吞吐,而重响应确定性:ZGC 吞吐略低于 Parallel GC,但延迟曲线极其平坦
若堆仅几十 GB 且业务允许 50ms 内暂停,G1 或 Shenandoah 可能更省资源;若追求吞吐压测极限,Parallel GC 仍是首选。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











