Skip to content

垃圾回收器介绍

垃圾回收器

JVM 的垃圾回收器是实现垃圾回收算法的工具,用于自动管理堆内存,回收不再使用的对象。主要包括: 1. Serial:单线程,适合小规模应用。 2. Parallel:多线程并行,高吞吐量。 3. CMS(Concurrent Mark Sweep):并发低停顿,老年代为主。 4. G1(Garbage First):分代区域化,平衡吞吐量与停顿。 5. ZGC:超低停顿,适合大内存。 6. Shenandoah:并发整理,低停顿。

核心点

  • 根据吞吐量、停顿时间需求选择。

1. 回收器详解

(1) Serial(串行回收器)

  • 原理
  • 单线程执行 GC。
  • 年轻代:标记-复制。
  • 老年代:标记-整理。
  • 特点
  • STW(Stop The World):暂停所有应用线程。
  • 简单,内存占用低。
  • 参数
  • -XX:+UseSerialGC
  • 优点
  • 开销小,适合单核或小堆。
  • 缺点
  • 停顿时间长,多核利用率低。
  • 适用
  • 客户端应用,堆 < 100MB。

(2) Parallel(并行回收器)

  • 原理
  • 多线程并行执行 GC。
  • 年轻代:标记-复制。
  • 老年代:标记-整理。
  • 特点
  • Parallel Scavenge(年轻代)+ Parallel Old(老年代)。
  • 注重吞吐量(运行时间占比)。
  • 参数
  • -XX:+UseParallelGC
  • -XX:ParallelGCThreads=n:线程数。
  • 优点
  • 高吞吐量,多核利用好。
  • 缺点
  • 停顿时间较长。
  • 适用
  • 后台批处理,吞吐量优先。

(3) CMS(并发标记清除)

  • 原理
  • 并发执行标记-清除,主要针对老年代。
  • 阶段:
    1. 初始标记(STW):标记 GC Roots。
    2. 并发标记:与应用线程并行标记。
    3. 重新标记(STW):修正并发标记遗漏。
    4. 并发清除:回收垃圾。
  • 特点
  • 老年代用标记-清除,年轻代用 Serial 或 ParNew。
  • 参数
  • -XX:+UseConcMarkSweepGC
  • 优点
  • 低停顿,响应快。
  • 缺点
  • 碎片:标记-清除产生碎片。
  • 浮动垃圾:并发标记时新生垃圾。
  • CPU 占用高。
  • 适用
  • Web 服务,响应时间敏感。

(4) G1(Garbage First)

  • 原理
  • 将堆分为多个 Region(区域)。
  • 年轻代用标记-复制,老年代用标记-整理。
  • 优先回收垃圾最多的区域。
  • 阶段
  • 初始标记(STW)。
  • 并发标记。
  • 最终标记(STW)。
  • 筛选回收(STW)。
  • 特点
  • 可预测停顿时间(-XX:MaxGCPauseMillis)。
  • 无固定分代,逻辑分代。
  • 参数
  • -XX:+UseG1GC
  • 优点
  • 平衡吞吐量与停顿。
  • 无碎片(整理)。
  • 缺点
  • 内存占用高,复杂。
  • 适用
  • 大堆(>6GB),低停顿需求。

(5) ZGC(Z Garbage Collector)

  • 原理
  • 并发执行所有阶段(标记、转移、整理)。
  • 使用染色指针(Colored Pointers)追踪对象。
  • 特点
  • 停顿时间 < 10ms,与堆大小无关。
  • JDK 11 引入,15 稳定。
  • 参数
  • -XX:+UseZGC
  • 优点
  • 超低停顿,适合超大堆。
  • 缺点
  • 吞吐量稍低,CPU 占用高。
  • 不支持 32 位。
  • 适用
  • 高可用服务,大内存(>10GB)。

(6) Shenandoah

  • 原理
  • 类似 ZGC,并发标记和整理。
  • 使用 Brooks Pointers(转发指针)管理引用。
  • 特点
  • OpenJDK 项目,Red Hat 主导。
  • 停顿时间低至毫秒级。
  • 参数
  • -XX:+UseShenandoahGC
  • 优点
  • 低停顿,无碎片。
  • 缺点
  • 吞吐量稍逊,实验性。
  • 适用
  • 低延迟场景,测试环境。

2. 对比表

回收器 算法 停顿 吞吐量 特点 适用场景
Serial 标记-复制/整理 单线程 小型应用
Parallel 标记-复制/整理 多线程并行 批处理
CMS 标记-清除 并发,老年代 Web 服务
G1 标记-复制/整理 可控 区域化 大堆、低停顿
ZGC 并发标记-整理 极低 超低停顿 大内存、高可用
Shenandoah 并发标记-整理 极低 并发整理 低延迟实验

3. GC 流程示例(G1)

堆: [Eden | S0 | S1 | Old Regions]
1. Eden 满 --> Minor GC (标记-复制到 S0/S1)
2. S0/S1 存活 --> 晋升到 Old
3. Old 满 --> Mixed GC (标记-整理)

4. 延伸与面试角度

  • 选择依据
  • 吞吐量:Parallel。
  • 低停顿:CMS、G1、ZGC。
  • 大堆:G1、ZGC。
  • 调优参数
  • -Xms/-Xmx:堆大小。
  • -XX:GCTimeRatio:吞吐量目标。
  • 实际应用
  • Tomcat:G1 或 CMS。
  • 大数据:Parallel。
  • 面试点
  • 问“种类”时,提六种及特点。
  • 问“区别”时,提停顿与吞吐量。

总结

JVM 垃圾回收器从 Serial 到 ZGC,逐步优化吞吐量和停顿时间,适配不同场景。Serial 简单,Parallel 高吞吐,CMS/G1/ZGC 低停顿。面试时,可提算法对应或画 GC 流程,展示理解深度。