在上一篇文章中,我们深入探讨了 JVM 的类加载机制与自定义类加载器的实现,为理解字节码运行时的生命周期奠定了坚实基础。接下来,我们将进入 JVM 性能调优的核心领域之一——垃圾收集器(Garbage Collector, GC)。
GC 是 JVM 实现自动内存管理的关键模块,选择合适的 GC 策略与参数不仅影响吞吐量和延迟,还关乎系统的可预测性和稳定性。本文将从架构、特点、适用场景等多个维度,全面对比 JVM 中最具代表性的四类收集器:Serial、CMS、G1 和 ZGC。
JVM 提供了多种垃圾收集器,不同 GC 的算法模型、并发能力和停顿特性各不相同。选错 GC 不仅无法充分发挥硬件潜力,还可能引发以下问题:
优秀的 GC 选择与配置能大幅优化吞吐率与稳定性,是每个高级开发者必须掌握的核心技能。
收集器 | 算法 | 并发 | 停顿 | 适用场景 |
---|---|---|---|---|
Serial | 复制 / 标记清除 | 无 | STW,单线程 | Client、小堆、单核 |
CMS | 标记-清除 | 并发标记 | 短停顿 | Web、低延迟服务 |
G1 | 分区整理 | 并发标记 | 可控停顿 | 大堆、混合场景 |
ZGC | 并发标记-整理 | 全并发 | 毫秒级停顿 | 超低延迟、大内存应用 |
优点 | 缺点 |
---|---|
吞吐率尚可 | 无并发、暂停时间长 |
适合资源受限环境 | 不适合响应敏感业务 |
-XX:+UseSerialGC
优点 | 缺点 |
---|---|
老年代大部分并发,STW 短 | 无整理,容易碎片化 |
多线程回收,适合多核 | 需预留空间防止 promotion failed |
响应好于 Serial | 并发模式失败会触发 Full GC(单线程) |
-XX:CMSInitiatingOccupancyFraction=70
控制触发阈值-XX:+UseCMSInitiatingOccupancyOnly
避免动态调节-XX:+UseConcMarkSweepGC
⚠️ 注:CMS 已在 JDK 14 被移除,建议迁移至 G1 或 ZGC。
优点 | 缺点 |
---|---|
支持并发标记,预测 STW 时间 | 调优参数较多 |
减少 Full GC 频率 | Mixed GC 过程复杂 |
自动整理,避免碎片 | 初始配置成本较高 |
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
控制最大停顿目标(毫秒)-XX:G1HeapRegionSize=4m
调整 Region 粒度-XX:InitiatingHeapOccupancyPercent=45
控制 Mixed GC 触发推荐生产环境默认选择 G1,适配性强。
优点 | 缺点 |
---|---|
超低延迟,适合 RT < 10ms 场景 | 不支持 JDK 8,需 JDK 11+ |
完整并发回收 + 整理 | 对 CPU 敏感,吞吐略低 |
内存碎片率极低 | 可视化支持弱于 G1(需配合 JFR) |
-XX:+UseZGC
配合:-Xms4G -Xmx4G
固定堆配置更稳定
特性对比 | Serial | CMS | G1 | ZGC |
---|---|---|---|---|
并发能力 | ❌ 无 | ✅ 老年代并发 | ✅ 全堆并发 | ✅ 全阶段并发 |
STW 时长 | 长 | 短(部分) | 中等可控 | 极短(<10ms) |
吞吐能力 | 中等 | 高 | 高 | 中 |
内存整理 | ❌ 否 | ❌ 否(碎片) | ✅ 是 | ✅ 是 |
容量支持 | 小堆 | 中堆 | 大堆(>8G) | 超大堆(TB 级) |
适用场景 | 小应用 | 响应优先 | 大部分应用 | 实时系统、大数据、高频交易 |
推荐版本 | JDK 8- | JDK 8-13 | JDK 11+ | JDK 17+(推荐) |
Java 的 GC 机制从单线程到多线程,再到 Region 化、指针隔离与可预测低延迟,是面向未来服务架构的演进路线。
下一篇《第 5 篇:GC 日志全面解析与性能分析实战》将深入 GC 日志结构与字段,教你如何通过日志定位 GC 瓶颈、优化应用停顿、分析对象生命周期,内容更贴近实战与故障排查。