目录
-
-
- 一、垃圾回收器分类三维图
- 二、7大经典回收器对比表(核心特性+适用场景)
- 三、回收器工作机制图解
-
- [1. **Serial回收器 - "单线程保洁员"**](#1. Serial回收器 - “单线程保洁员”)
- [2. **CMS回收器 - "低延迟专家"**](#2. CMS回收器 - “低延迟专家”)
- [3. **G1回收器 - "分区回收大师"**](#3. G1回收器 - “分区回收大师”)
- [4. **ZGC回收器 - "TB级堆的极速王者"**](#4. ZGC回收器 - “TB级堆的极速王者”)
- 四、不同场景回收器选型指南
- 五、调优实战案例:日活百万的APP后端优化
- [六、新一代回收器对比(ZGC vs Shenandoah)](#六、新一代回收器对比(ZGC vs Shenandoah))
- 七、回收器参数优化模板
- 八、终极选型决策树
-
以下是针对零基础学习者的 JVM垃圾回收器分类与回收机制 终极解析,结合可视化模型与实战对比,助你彻底掌握不同回收器的核心差异与选型策略:
一、垃圾回收器分类三维图
垃圾回收器 线程模式 内存区域 算法类型 单线程 多线程并行 多线程并发 新生代 老年代 全堆 标记-复制 标记-清除 标记-整理
二、7大经典回收器对比表(核心特性+适用场景)
回收器 | 分代 | 线程模式 | 算法 | 适用场景 | STW时间 | 启用参数 |
---|---|---|---|---|---|---|
Serial | 新生代 | 单线程 | 复制 | 客户端程序/小内存 | 高 | -XX:+UseSerialGC |
ParNew | 新生代 | 并行 | 复制 | CMS搭档 | 中 | -XX:+UseParNewGC |
Parallel Scavenge | 新生代 | 并行 | 复制 | 吞吐量优先应用 | 中 | -XX:+UseParallelGC |
Serial Old | 老年代 | 单线程 | 标记-整理 | Client模式 | 高 | 默认启用 |
Parallel Old | 老年代 | 并行 | 标记-整理 | 吞吐量优先应用 | 中 | -XX:+UseParallelOldGC |
CMS | 老年代 | 并发 | 标记-清除 | Web服务/低延迟系统 | 低(但存在浮动垃圾) | -XX:+UseConcMarkSweepGC |
G1 | 全堆 | 并发 | 分区+标记-整理 | 大内存(6G+)/平衡吞吐与延迟 | 可预测 | -XX:+UseG1GC |
ZGC | 全堆 | 并发 | 着色指针+读屏障 | 超大堆(TB级)/极致低延迟 | <10ms | -XX:+UseZGC |
Shenandoah | 全堆 | 并发 | 转发指针 | 低延迟/大堆 | <10ms | -XX:+UseShenandoahGC |
📌 核心选择标准:
- 吞吐量优先 → Parallel Scavenge + Parallel Old
- 低延迟优先 → G1/ZGC/Shenandoah
- 小内存 → Serial + Serial Old
三、回收器工作机制图解
1. Serial回收器 - "单线程保洁员"
应用线程 Serial GC Eden区满 暂停所有线程(STW) 单线程标记存活对象 复制到Survivor区 恢复运行 应用线程 Serial GC
特点:简单高效无竞争,但STW时间长
2. CMS回收器 - "低延迟专家"
初始标记 STW 并发标记 重新标记 STW 并发清除
四步过程:
- 初始标记:标记GC Roots直接关联对象(STW短)
- 并发标记:遍历对象图(与用户线程并发)
- 重新标记:修正并发标记变动(STW中)
- 并发清除:清理垃圾对象(并发)
致命缺陷:内存碎片 + 并发模式失败(Concurrent Mode Failure)
3. G1回收器 - "分区回收大师"
G1堆结构 Region2 Region1 Region4 Region3 Region2048 ... 回收过程 初始标记 STW 并发标记 最终标记 STW 筛选回收 STW
核心创新:
- 将堆划分为等长Region(默认2048个)
- 优先回收价值最大的Region(垃圾比例高)
- 可预测停顿模型 :
-XX:MaxGCPauseMillis=200
4. ZGC回收器 - "TB级堆的极速王者"
并发标记 并发预备重分配 并发重分配 并发重映射
三大黑科技:
- 着色指针:在指针中存储对象状态信息
- 读屏障:动态修正对象引用
- 内存映射:支持TB级堆,STW<10ms
适用场景:云原生/大数据/实时交易系统
四、不同场景回收器选型指南
场景1:电商大促系统(8核16G)
bash
# 目标:平衡吞吐与延迟
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=4m
场景2:金融交易系统(低延迟要求)
bash
# 亚毫秒级暂停
-XX:+UseZGC
-XX:+ZGenerational # JDK21+启用分代ZGC
-Xmx32g
场景3:数据分析批处理(吞吐优先)
bash
# 最大化计算资源利用率
-XX:+UseParallelGC
-XX:ParallelGCThreads=8
-XX:GCTimeRatio=99 # GC时间占比<1%
五、调优实战案例:日活百万的APP后端优化
问题现象:
- 高峰期API延迟飙升至2秒
- CMS频繁发生Concurrent Mode Failure
优化过程:
-
诊断工具 :
bash# 发现老年代碎片率45% jmap -heap <pid> # GC日志显示: [CMS-concurrent-mark: 1.234/2.345 secs] [CMS Failure: Allocation Failure]
-
切换回收器 :
bash# 从CMS迁移到G1 -XX:+UseG1GC -XX:MaxGCPauseMillis=150 -XX:G1HeapRegionSize=4m
-
结果对比 :
指标 CMS G1 提升幅度 平均延迟 1240ms 230ms 81%↓ 99%延迟 3560ms 450ms 87%↓ Full GC次数 12次/小时 0次 100%↓
六、新一代回收器对比(ZGC vs Shenandoah)
特性 | ZGC(Oracle) | Shenandoah(RedHat) |
---|---|---|
最大堆 | 16TB | 16TB |
暂停时间 | <10ms | <10ms |
分代支持 | JDK21+(-XX:+ZGenerational) | 暂不支持 |
内存开销 | 15-20% | 10-15% |
压缩指针 | 必须启用 | 可选 |
适用JDK | JDK11+ | JDK8u/11/17 |
💡 选型建议:
- OpenJDK环境 → Shenandoah(兼容性更好)
- Oracle JDK → ZGC(官方支持更强)
七、回收器参数优化模板
G1调优模板(16G堆):
bash
-XX:+UseG1GC
-Xms12g -Xmx12g
-XX:MaxGCPauseMillis=200 # 目标暂停时间
-XX:G1HeapRegionSize=4m # 区域大小
-XX:InitiatingHeapOccupancyPercent=45 # 老年代占比45%触发GC
-XX:ConcGCThreads=4 # 并发线程数
-XX:G1ReservePercent=15 # 保留内存防晋升失败
ZGC调优模板(大内存):
bash
-XX:+UseZGC
-Xms24g -Xmx24g
-XX:ConcGCThreads=8 # 并发线程数
-XX:SoftMaxHeapSize=20g # 动态堆调整上限
-XX:+ZProactive # 主动触发回收
-XX:+ZGenerational # JDK21+启用分代
八、终极选型决策树

避坑指南:
- CMS在JDK14被废弃,JDK17移除 → 勿在新项目使用
- G1的
-XX:MaxGCPauseMillis
只是目标值,非硬承诺- ZGC在JDK21前无分代 → 年轻代回收效率低
通过本指南,您将掌握:
✅ 主流回收器核心工作机制
✅ 不同场景下的选型策略
✅ 关键参数优化技巧
✅ 避免回收器选型误区
✅ 应对高并发低延迟的终极方案
立即行动 :使用命令java -XX:+PrintFlagsFinal -version | grep GC
查看当前JVM默认回收器!