ZGC(Z Garbage Collector)是Oracle在Java 11中引入的一款低延迟垃圾收集器 ,设计目标是支持大容量内存(最大16TB)并将垃圾回收(GC)停顿时间控制在亚毫秒级,主要面向对响应时间敏感的大型应用(如金融交易、实时数据分析等)。
一、ZGC的核心原理
ZGC的低延迟特性源于其独特的设计,核心机制包括:
1. 着色指针(Colored Pointers)
ZGC利用64位地址空间中未被使用的高位(通常是高18位)存储"标记信息"(如对象是否存活、是否被移动等),无需额外的元数据存储(如传统GC的"标记位"需要单独的内存区域)。
- 优势:通过指针本身携带状态,避免了传统GC中"卡片标记""记忆集"等复杂机制,减少内存开销和操作耗时。
- 限制:依赖CPU支持"未使用地址位作为元数据"(多数现代64位CPU支持)。
2. 读屏障(Load Barrier)
ZGC在应用线程读取对象引用时插入一段轻量代码(读屏障),用于检查指针的"颜色"(标记信息),并在必要时进行指针修复(如对象被移动后,更新引用至新地址)。
- 作用:确保应用线程访问的始终是对象的最新地址,支持GC线程与应用线程的完全并发(无需停顿应用线程即可移动对象)。
- 开销:读屏障会带来轻微的CPU消耗(通常在1%-3%),但远小于传统GC的停顿成本。
3. 并发处理全阶段
ZGC的核心GC过程(标记、转移、重定位)几乎全在并发阶段完成,仅初始标记(Initial Mark)和最终标记(Final Mark)有极短停顿(通常<1ms):
- 初始标记:标记根对象(如线程栈、静态变量),停顿时间与根对象数量成正比(通常极短)。
- 并发标记:从根对象出发,遍历并标记所有存活对象(与应用线程并行)。
- 并发预备转移:计算需要转移的对象(如碎片化区域中的对象)。
- 并发转移:将存活对象移动到新的内存区域(消除碎片),通过读屏障保证应用线程访问正确地址。
- 并发重定位:更新所有指向旧地址的引用(与应用线程并行)。
4. 区域化内存管理(Regions)
ZGC将堆内存划分为多个大小可变的区域(Region,1MB-4GB),根据对象大小(小对象、大对象、巨型对象)分配到不同区域,便于针对性回收。
- 优势:支持动态调整区域大小,减少内存碎片;回收时可只处理部分区域(而非全堆),提升效率。
5. 分代支持(Java 15+)
Java 15起,ZGC引入分代机制(Generational ZGC),将对象分为"年轻代"和"老年代":
- 年轻代对象回收频率高(多数对象"朝生夕死"),通过快速回收年轻代减少整体GC压力;
- 老年代对象回收频率低,专注于长期存活对象的管理。
二、ZGC的使用方法
启用ZGC需满足:
- JDK版本:Java 11及以上(Java 17+为稳定版,推荐使用);
- 操作系统:Linux(64位)、Windows(Java 16+支持)、macOS(ARM架构Java 17+支持)。
核心JVM参数
bash
# 启用ZGC
-XX:+UseZGC
# 设置最大堆内存(ZGC适合大堆,建议至少10GB以上发挥优势)
-Xmx32g
# 启用分代ZGC(Java 15+,默认关闭)
-XX:+ZGenerational
# 其他调优参数(可选)
-XX:ZGCHeapSizeLimit=64g # 堆内存上限(默认无限制,最大16TB)
-XX:ZCollectionInterval=30 # 两次GC的最小间隔(秒,避免频繁GC)
三、ZGC的优势
- 超低延迟 :GC停顿时间通常在0.1-1ms,远低于G1(通常10-100ms),适合对响应时间敏感的场景(如高频交易、实时游戏)。
- 支持超大堆:最大支持16TB内存,满足现代服务器的大内存需求(如分布式缓存、大数据处理)。
- 并发能力强:几乎所有GC阶段与应用线程并行,对应用吞吐量的影响小(相比SerialGC、ParallelGC等停顿型GC)。
- 内存碎片少:通过并发转移机制动态整理内存,长期运行也能保持较低的碎片率。
- 易于调优:参数少且默认配置合理,多数场景无需复杂调优即可达到良好效果。
四、ZGC的劣势
- 吞吐量略低:相比G1或ParallelGC,ZGC的并发操作(如读屏障、并发标记)会消耗更多CPU资源,在小堆(<10GB)场景下,吞吐量可能低于G1。
- 读屏障开销:虽然读屏障开销较小,但对"频繁读取对象引用"的应用(如大量使用链表、树结构)可能有性能影响。
- 分代支持较新:分代ZGC在Java 15才引入,相比G1的分代机制(成熟多年),在某些极端场景下优化可能不足。
- 工具链支持滞后:部分监控工具(如早期版本的VisualVM)对ZGC的指标(如GC阶段耗时)支持不够完善,需依赖JDK自带工具(jstat、jcmd)。
五、适用场景
- 推荐场景:大内存(≥10GB)、低延迟需求(如金融交易、实时数据分析、大型分布式服务)。
- 不推荐场景:小堆(<5GB)、吞吐量优先(如离线批处理)、对CPU资源极度敏感的应用。
总结
ZGC是JVM垃圾收集器的重大突破,其"低延迟+大内存支持"特性使其成为现代大型应用的理想选择。但需注意,它并非"银弹",在小堆或吞吐量优先场景下,G1仍是更务实的选择。实际使用中,建议结合压测数据(延迟、吞吐量、内存碎片)评估是否适合业务场景。