主流JVM垃圾回收器详解与回收流程

一、Serial GC(串行回收器)

1.1 核心特性

  • 单线程工作:全程仅使用单线程执行垃圾回收
  • Stop-The-World (STW):回收期间暂停所有应用线程
  • 适用场景:单核CPU/小型应用(Client模式默认)

1.2 回收流程

  1. 暂停应用线程(STW)
  2. 标记阶段:从GC Roots出发标记存活对象
  3. 清除阶段:回收未标记对象
  4. 内存整理(Serial Old使用标记-整理算法)

参数配置

-XX:+UseSerialGC        # 启用Serial+Serial Old组合
-XX:SurvivorRatio=8     # Eden/Survivor区比例

二、Parallel GC(并行回收器)

2.1 核心特性

  • 多线程并行:充分利用多核CPU
  • 高吞吐量:关注总吞吐量而非停顿时间
  • 分代收集:Young GC使用复制算法,Old GC使用标记-整理

2.2 回收流程

  1. Young GC

    • 并行复制Eden和Survivor区存活对象
    • 对象年龄达到阈值(默认15)晋升老年代
  2. Full GC

    • 并行标记老年代存活对象
    • 并行整理内存消除碎片

参数配置

-XX:+UseParallelGC      # 启用Parallel+Serial Old组合
-XX:ParallelGCThreads=4 # 设置GC线程数
-XX:MaxGCPauseMillis=200 # 最大停顿时间目标

三、CMS(Concurrent Mark-Sweep)

3.1 核心特性

  • 低延迟:减少STW时间至毫秒级
  • 标记-清除算法:存在内存碎片问题
  • 适用场景:Web应用/对响应时间敏感的场景

3.2 回收流程(四阶段)

  1. 初始标记 (STW)

    • 标记GC Roots直接关联对象(约1ms)
  2. 并发标记

    • 与应用线程并行标记所有存活对象
    • 使用三色标记法(白/灰/黑)
  3. 重新标记 (STW)

    • 修正并发标记期间的引用变化
    • 采用增量更新算法
  4. 并发清除

    • 清理未标记对象(与应用线程并发)

关键优化

  • 卡表 (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 回收流程

  1. 年轻代回收 (Young GC)

    • 并行复制Eden和Survivor区存活对象
    • 存活对象晋升至Survivor或老年代Region
  2. 并发标记

    • 初始标记(STW)
    • 并发标记所有存活对象
    • 最终标记(STW)
  3. 混合回收 (Mixed GC)

    • 回收部分老年代Region
    • 使用Remembered Set记录跨Region引用
  4. 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 回收流程

  1. 初始标记:短暂STW标记根对象
  2. 并发标记:遍历对象图并记录染色指针
  3. 并发转移:移动存活对象至新内存区域
  4. 重置卡表:更新内存映射信息

技术突破

  • 读屏障 (Load Barrier):实时识别对象状态
  • 自适应调整:根据负载动态优化回收策略

参数配置

-XX:+UseZGC
-XX:ZAllocationSpikeTolerance=2.0 # 内存分配尖峰容忍度

六、Shenandoah GC

6.1 核心特性

  • 完全并发回收:无STW阶段
  • Brooks指针技术:支持对象移动时的并发访问
  • 低内存占用:减少元数据开销

6.2 回收流程

  1. 初始标记:STW标记根对象
  2. 并发标记:并行遍历对象图
  3. 并发转移:移动存活对象至空闲Region
  4. 最终清理:回收未标记对象

创新点

  • 转发指针:实现对象移动时的透明访问
  • 自适应算法:根据应用行为动态调整策略

七、垃圾回收器对比

回收器停顿时间吞吐量适用场景内存碎片
Serial单核/小型应用
Parallel中等最高多核批处理任务
CMS毫秒级中等Web应用/低延迟需求
G1可预测(百ms)大内存/混合负载较少
ZGC亚毫秒级中等超大规模内存
Shenandoah亚毫秒级中等低延迟/高吞吐场景

八、选型建议

  1. 低延迟场景:优先选择ZGC或Shenandoah
  2. 大内存应用:G1或ZGC(支持TB级堆)
  3. 高吞吐量需求:Parallel GC
  4. 传统Web应用:CMS(需注意碎片问题)
  5. 客户端应用:Serial GC(简单高效)

通过合理配置参数(如-XX:MaxGCPauseMillis)和监控工具(如GC日志分析),可显著提升应用性能。建议生产环境结合分代收集区域化管理策略,形成多级垃圾回收体系。