主流JVM垃圾回收器详解与回收流程
一、Serial GC(串行回收器)
1.1 核心特性
- 单线程工作:全程仅使用单线程执行垃圾回收
- Stop-The-World (STW):回收期间暂停所有应用线程
- 适用场景:单核CPU/小型应用(Client模式默认)
1.2 回收流程
- 暂停应用线程(STW)
- 标记阶段:从GC Roots出发标记存活对象
- 清除阶段:回收未标记对象
- 内存整理(Serial Old使用标记-整理算法)
参数配置:
-XX:+UseSerialGC # 启用Serial+Serial Old组合
-XX:SurvivorRatio=8 # Eden/Survivor区比例
二、Parallel GC(并行回收器)
2.1 核心特性
- 多线程并行:充分利用多核CPU
- 高吞吐量:关注总吞吐量而非停顿时间
- 分代收集:Young GC使用复制算法,Old GC使用标记-整理
2.2 回收流程
-
Young GC:
- 并行复制Eden和Survivor区存活对象
- 对象年龄达到阈值(默认15)晋升老年代
-
Full GC:
- 并行标记老年代存活对象
- 并行整理内存消除碎片
参数配置:
-XX:+UseParallelGC # 启用Parallel+Serial Old组合
-XX:ParallelGCThreads=4 # 设置GC线程数
-XX:MaxGCPauseMillis=200 # 最大停顿时间目标
三、CMS(Concurrent Mark-Sweep)
3.1 核心特性
- 低延迟:减少STW时间至毫秒级
- 标记-清除算法:存在内存碎片问题
- 适用场景:Web应用/对响应时间敏感的场景
3.2 回收流程(四阶段)
-
初始标记 (STW):
- 标记GC Roots直接关联对象(约1ms)
-
并发标记:
- 与应用线程并行标记所有存活对象
- 使用三色标记法(白/灰/黑)
-
重新标记 (STW):
- 修正并发标记期间的引用变化
- 采用增量更新算法
-
并发清除:
- 清理未标记对象(与应用线程并发)
关键优化:
- 卡表 (Card Table):记录老年代对新生代的引用
- Concurrent Mode Failure:内存不足时退化为Serial Old
参数配置:
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=70 # 触发CMS的堆占用阈值
-XX:+UseCMSInitiatingOccupancyOnly # 严格遵循阈值
四、G1(Garbage-First)
4.1 核心特性
- 区域化内存管理:将堆划分为2048个Region
- 可预测停顿:通过优先级选择回收价值最高的Region
- 混合回收:同时处理年轻代和老年代
4.2 回收流程
-
年轻代回收 (Young GC):
- 并行复制Eden和Survivor区存活对象
- 存活对象晋升至Survivor或老年代Region
-
并发标记:
- 初始标记(STW)
- 并发标记所有存活对象
- 最终标记(STW)
-
混合回收 (Mixed GC):
- 回收部分老年代Region
- 使用Remembered Set记录跨Region引用
-
Full GC:
- 单线程标记-整理(极端情况下触发)
关键机制:
- Humongous Region:处理超大对象(>50% Region大小)
- RSet (Remembered Set):跟踪跨Region引用
参数配置:
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=16m # 调整Region大小
五、ZGC(Z Garbage Collector)
5.1 核心特性
- 亚毫秒级停顿:<10ms
- 染色指针技术:利用对象头存储GC信息
- 全并发回收:无STW阶段
5.2 回收流程
- 初始标记:短暂STW标记根对象
- 并发标记:遍历对象图并记录染色指针
- 并发转移:移动存活对象至新内存区域
- 重置卡表:更新内存映射信息
技术突破:
- 读屏障 (Load Barrier):实时识别对象状态
- 自适应调整:根据负载动态优化回收策略
参数配置:
-XX:+UseZGC
-XX:ZAllocationSpikeTolerance=2.0 # 内存分配尖峰容忍度
六、Shenandoah GC
6.1 核心特性
- 完全并发回收:无STW阶段
- Brooks指针技术:支持对象移动时的并发访问
- 低内存占用:减少元数据开销
6.2 回收流程
- 初始标记:STW标记根对象
- 并发标记:并行遍历对象图
- 并发转移:移动存活对象至空闲Region
- 最终清理:回收未标记对象
创新点:
- 转发指针:实现对象移动时的透明访问
- 自适应算法:根据应用行为动态调整策略
七、垃圾回收器对比
| 回收器 | 停顿时间 | 吞吐量 | 适用场景 | 内存碎片 |
|---|---|---|---|---|
| Serial | 长 | 高 | 单核/小型应用 | 无 |
| Parallel | 中等 | 最高 | 多核批处理任务 | 有 |
| CMS | 毫秒级 | 中等 | Web应用/低延迟需求 | 有 |
| G1 | 可预测(百ms) | 高 | 大内存/混合负载 | 较少 |
| ZGC | 亚毫秒级 | 中等 | 超大规模内存 | 无 |
| Shenandoah | 亚毫秒级 | 中等 | 低延迟/高吞吐场景 | 无 |
八、选型建议
- 低延迟场景:优先选择ZGC或Shenandoah
- 大内存应用:G1或ZGC(支持TB级堆)
- 高吞吐量需求:Parallel GC
- 传统Web应用:CMS(需注意碎片问题)
- 客户端应用:Serial GC(简单高效)
通过合理配置参数(如-XX:MaxGCPauseMillis)和监控工具(如GC日志分析),可显著提升应用性能。建议生产环境结合分代收集和区域化管理策略,形成多级垃圾回收体系。