启用ZGC只需-XX:+UseZGC配合堆大小设置(如-Xms4g -Xmx16g),JDK 15起为正式特性,支持TB级大堆与亚毫秒停顿;其低延迟依赖全并发标记/转移、着色指针和加载屏障等核心技术。

Java 中启用 ZGC 只需添加几个 JVM 参数,它专为超大堆(TB 级)设计,能在几乎不暂停应用线程的前提下完成垃圾回收,典型停顿控制在 10ms 以内,多数场景下甚至低于 1ms。
启用 ZGC 的基本配置
ZGC 是 JDK 11 引入的实验性 GC,在 JDK 15 成为正式特性,JDK 17+ 默认可用。使用前需确认 JDK 版本 ≥ 15(推荐 17 或 21),且操作系统支持(Linux x64、Aarch64、Windows x64、macOS x64/Aarch64)。
- 最简启动参数:-XX:+UseZGC
- 配合堆大小设置(ZGC 对堆大小无硬性上限,但建议从 4GB 起):-Xms4g -Xmx16g
- 可选:让 JVM 自动调优并发线程数:-XX:ZCollectionInterval=5(表示空闲时每 5 秒尝试一次回收)
ZGC 停顿为何能压到亚毫秒
ZGC 的低延迟核心在于全并发执行:标记、转移、重定位等关键阶段全部与用户线程并行运行,仅需极短的“初始标记”和“最终标记”两个 STW 阶段,且它们只扫描根对象(如线程栈、静态变量),不遍历整个堆。
- 所有堆内存被划分为多个 页面(page),每个页面独立管理,避免全局锁竞争
- 使用 着色指针(colored pointer) 技术,在对象引用中直接编码元数据(如是否已标记、是否已重定位),省去额外的标记位数组和读写屏障开销
- 转移阶段通过 加载屏障(load barrier) 拦截对象访问,在首次读取时原子更新引用,实现“边用边搬”
适用场景与关键注意事项
ZGC 不是万能银弹,它对吞吐量有一定折损(约 10%~15%),更适合对响应时间极度敏感、堆内存巨大的服务,比如实时风控、高频交易、大型缓存服务或大数据批处理中间件。
立即学习“Java免费学习笔记(深入)”;
- 堆大小建议 ≥ 4GB;小于 2GB 时,G1 或 Serial GC 可能更高效
- 避免频繁创建/销毁大量短期对象——ZGC 的并发标记虽快,但对象生命周期过短会增加元数据维护负担
- 监控关键指标:ZGC Pauses(STW 时间)、ZGC Cycles(完整回收周期)、Heap Usage(注意 ZGC 不主动返还内存给 OS,需配合 -XX:ZUncommitDelay 控制)
快速验证 ZGC 是否生效
启动应用后,加参数 -Xlog:gc*:stdout:time,tags 查看日志,成功启用会输出类似:
[0.123s][info][gc] Using Z Garbage Collector
[1.456s][info][gc] GC(0) Pause Mark Start 1.234MB->1.235MB(4096MB) 0.087ms
其中 0.087ms 即本次 STW 停顿,远低于 1ms —— 这就是 ZGC “亚毫秒级停顿”的直观体现。


















