JVM(3)——垃圾回收器
本文将深入剖析JVM垃圾回收器的核心原理、实现细节和调优实践,涵盖7大主流回收器+3大前沿技术+20个调优参数,通过GC日志真实案例+内存布局示意图,带您彻底掌握JVM内存回收的底层机制。
一、垃圾回收器架构全景
1.1 回收器代际关系
1.2 关键特性对比
回收器 | JDK版本 | 工作模式 | 暂停时间 | 适用堆大小 | 碎片处理 |
---|---|---|---|---|---|
Serial | 全版本 | STW | 高 | <100MB | 整理 |
ParNew | ≤8 | STW | 中 | <4GB | 无 |
Parallel | 全版本 | STW | 中 | 4-8GB | 整理 |
CMS | ≤14 | 并发 | 低 | 4-8GB | 不处理 |
G1 | ≥7 | 并发 | 可控 | >4GB | 整理 |
ZGC | ≥15 | 并发 | 亚毫秒 | >8GB | 整理 |
Shenandoah | OpenJDK | 并发 | 亚毫秒 | >8GB | 整理 |
二、经典回收器深度解析
2.1 Serial/Serial Old - 单线程时代的基石
组合方式:
-
新生代:Serial(复制算法)
-
老年代:Serial Old(标记-整理算法)
工作流程:
适用场景:
-
客户端应用(-client模式)
-
嵌入式设备
-
内存<100MB的小型应用
参数启用:
-XX:+UseSerialGC
2.2 ParNew/CMS - 并发回收的里程碑
ParNew工作特点:
-
Serial的多线程版本
-
与CMS配合使用
-
默认线程数 = CPU核心数
# 启用ParNew
-XX:+UseParNewGC# 设置线程数
-XX:ParallelGCThreads=4
CMS四阶段详解:
关键调优参数:
-XX:CMSInitiatingOccupancyFraction=75 # 老年代75%时触发
-XX:+CMSScavengeBeforeRemark # 重新标记前YGC
-XX:+UseCMSCompactAtFullCollection # FullGC后压缩
2.3 Parallel Scavenge/Old - 吞吐量之王
设计哲学:
吞吐量 = 应用运行时间 / (应用运行时间 + GC时间) * 100%
自适应策略:
参数配置:
# 启用Parallel
-XX:+UseParallelGC
-XX:+UseParallelOldGC# 吞吐量目标
-XX:GCTimeRatio=99 # GC时间占比1%
-XX:MaxGCPauseMillis=200 # 最大暂停时间
三、现代回收器革命性突破
3.1 G1(Garbage-First) - JDK9+默认回收器
内存布局创新:
核心工作流程:
调优矩阵:
目标 | 关键参数 | 推荐值 |
---|---|---|
低延迟 | -XX:MaxGCPauseMillis | 50-200ms |
高吞吐 | -XX:GCPauseIntervalMillis | 300-500ms |
大堆 | -XX:G1HeapRegionSize | 4-32MB |
快速启动 | -XX:G1ConcRefinementThreads | CPU核心数 |
3.2 ZGC - 亚毫秒级暂停的奇迹
三大核心技术:
-
染色指针(Colored Pointers)
// 64位指针结构 | 18位保留 | 1位Finalizable | 1位Remap | 1位Marked1 | 1位Marked0 | 42位地址 |
-
内存多重映射
# Linux查看内存映射 cat /proc/<pid>/maps | grep heap
-
并发对象转移
// 对象移动时引用自愈 void accessField() {// 访问字段时自动修正指针 }
参数配置:
-XX:+UseZGC
-XX:ZAllocationSpikeTolerance=5.0
-XX:ZProactive=true # 主动触发GC
3.3 Shenandoah - 低延迟的开放选择
Brooks指针实现:
struct Object {uint64_t forwarding_pointer; // 指向新地址uint32_t hash;uint16_t lock_bits;// ... 其他字段
};
工作流程对比:
阶段 | G1 | Shenandoah | ZGC |
---|---|---|---|
初始标记 | STW | STW | STW |
并发标记 | 并发 | 并发 | 并发 |
最终标记 | STW | STW | STW |
清理 | STW | 并发 | 并发 |
对象转移 | STW | 并发 | 并发 |
适用场景:
-
需要亚毫秒暂停的实时系统
-
OpenJDK环境
-
32GB以上大内存
四、生产环境调优实战
4.1 CMS调优案例
问题现象:
[GC (Allocation Failure) [ParNew: 367616K->40960K(367616K), 0.0468480 secs]
524289K->524289K(786432K), [CMS: 0K->0K(786432K), 0.0 secs]
// 频繁Concurrent Mode Failure
优化方案:
# 原配置
-XX:CMSInitiatingOccupancyFraction=70# 优化配置
-XX:CMSInitiatingOccupancyFraction=60
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+CMSScavengeBeforeRemark
-XX:ParallelGCThreads=8
4.2 G1调优案例
问题现象:
[GC pause (G1 Evacuation Pause) (young) [Object Copy: 1500 ms] # 对象复制耗时过长
优化方案:
# 原配置
-XX:MaxGCPauseMillis=100# 优化配置
-XX:MaxGCPauseMillis=200
-XX:G1NewSizePercent=10
-XX:G1MaxNewSizePercent=30
-XX:G1HeapRegionSize=16m