ZGC 深度解析
ZGC(Z Garbage Collector)是 Oracle 于 Java 11 引入的低延迟垃圾收集器,Java 15 正式生产可用。ZGC 的核心目标是:将停顿时间控制在 10ms 以内,同时支持数百 GB 甚至 TB 级别的堆内存。
ZGC 的创新在于:几乎所有 GC 阶段都与应用并发执行,Stop The World 时间与堆大小无关,始终保持在亚毫秒级别。
ZGC 设计目标
ZGC 的设计目标是解决传统收集器的痛点:
ZGC 工作原理
着色指针(Colored Pointers)
ZGC 使用着色指针(Colored Pointers)在对象头中存储 GC 状态信息:
读屏障(Load Barrier)
ZGC 在每次读取对象引用时执行读屏障,检查对象的着色指针状态:
ZGC 工作阶段
ZGC 的工作分为三个主要阶段,每个阶段都尽量与应用并发执行:
阶段一:并发标记
- 初始标记:Stop The World,标记 GC Roots 直接引用的对象(
<0.1ms) - 并发标记:与应用并发执行,遍历对象图,标记存活对象
- 再标记:Stop The World,处理并发标记阶段的变更(
<0.1ms)
阶段二:并发转移
- 转移准备:计算哪些 Region 需要转移,确定转移预算
- 初始转移:Stop The World,转移 GC Roots 引用的对象(
<0.1ms) - 并发转移:与应用并发执行,转移需要回收的 Region 中的对象
阶段三:并发重定位
并发重定位与应用并发执行,更新所有对已转移对象的引用。
ZGC 性能特点
停顿时间不随堆增长
传统收集器的停顿时间随堆大小线性增长,而 ZGC 的停顿时间始终保持在亚毫秒级别:
吞吐量损失
ZGC 的并发执行带来吞吐量损失,通常为 5%~15%:
配置参数
启用 ZGC
核心参数
适用场景
ZGC 适合以下场景:
- 超大内存:
>16GB堆内存,ZGC的停顿时间优势明显 - 极低延迟:金融交易、游戏服务器、实时系统
- 高可用要求:无法接受长时间 GC 停顿的业务
- 容器化部署:容器内存
>8GB
ZGC 的限制
ZGC 不是银弹,有以下限制:
- 不支持指针压缩:ZGC 使用完整的 64 位地址,不支持
-XX:+UseCompressedOops - 不支持类数据共享:不支持
-Xshare - 内存不归还不及时:ZGC 默认延迟 5 分钟才归还未使用内存
- 不支持 JDK Flight Recorder 的某些功能