JVM 垃圾回收器(Garbage Collector, GC 收集器)


一、什么是垃圾回收器?

垃圾回收器(GC)是 JVM 中的内存管理模块,负责自动回收不再被引用的对象,避免内存泄漏和内存溢出。

核心目标:自动化内存管理、提升系统性能、减少开发者手动干预。


二、垃圾回收器分类(按代划分)

代区 回收器 特点
新生代(Young) Serial 单线程,简单稳定,适合小内存和单核CPU
ParNew Serial的多线程版,常与CMS配合
Parallel Scavenge 多线程,吞吐量优先,适合后台高并发应用
老年代(Old) Serial Old Serial的老年代版本
Parallel Old Parallel Scavenge的老年代版本,吞吐量优先
CMS(Concurrent Mark Sweep) 并发回收,低停顿,适合对响应时间敏感的应用
G1(Garbage First) 分区回收,低停顿,适合大堆内存和长时间运行的服务端应用
ZGC / Shenandoah 低延迟、支持大堆,几乎无停顿(JDK11+ 支持)

三、重点垃圾回收器详解

1️⃣ Serial GC(串行收集器)

  • 单线程(GC 和用户线程互斥)
  • 新生代:复制算法
  • 老年代:标记-清除-压缩
  • 特点:简单高效,适合单核、小堆内存场景

2️⃣ ParNew GC

  • Serial的多线程版本(多CPU环境下性能提升)
  • 通常与CMS搭配
  • 适合并发不高但要求低停顿的场景

3️⃣ Parallel GC(吞吐量优先,吞吐型)

  • 多线程
  • 新生代和老年代都有 Parallel 版本
  • 采用复制和标记-整理算法
  • 特点:高吞吐,适合批处理、大数据量计算场景

4️⃣ CMS(Concurrent Mark Sweep)

  • 并发低停顿,专为响应快设计
  • 回收过程四阶段(初始标记、并发标记、重新标记、并发清除)
  • 缺点:
    • 内存碎片
    • CPU 占用高
    • Full GC 代价大

5️⃣ G1(Garbage First)

  • JDK9 推荐的服务器级垃圾收集器
  • 将堆分为多个Region
  • 预测停顿时间
  • 混合回收(新生代+老年代一起)
  • 减少 Full GC 频率
  • 适合大内存、长时间运行的服务

6️⃣ ZGC(Zero GC) & Shenandoah(红帽)

  • 超低延迟(Pause Time < 10ms)
  • 支持大堆(数TB)
  • 并发回收,几乎无 STW(Stop-The-World)
  • 面向金融、电商、直播等对延迟极其敏感的场景

四、GC 选择总结(面试建议速记)

GC 收集器 适用场景 特点
Serial 单核、Client端 简单稳定,单线程
ParNew 多CPU中配合CMS 多线程,低停顿
Parallel 高吞吐后台、大数据 吞吐优先,多线程
CMS 低延迟Web系统 并发回收,内存碎片多
G1 大内存服务端 分区,低停顿,预估时间
ZGC / Shenandoah 金融、直播、低延迟场景 几乎无停顿,支持大堆

五、常见面试题总结

1️⃣ CMS 的优缺点?

  • 优:低停顿,并发回收
  • 缺:内存碎片,Full GC代价高

2️⃣ G1 和 CMS 区别?

  • G1 按 Region 分区,预测停顿
  • CMS 容易碎片,停顿不可控

3️⃣ ZGC 为什么几乎无停顿?

  • 因为 ZGC 全程并发执行标记和清理
  • 使用染色指针+读屏障,真正做到毫秒级停顿

4️⃣ 什么时候用 Parallel GC?

  • 吞吐量优先场景,比如后台处理、大批量日志分析

六、总结一条线(答题通用句式)

JVM 提供多款 GC 收集器,如 Serial、Parallel、CMS、G1、ZGC 等。
选择策略看业务需求:
- 吞吐优先选 Parallel
- 响应快选 CMS
- 大堆、低停顿选 G1
- 极致低延迟场景用 ZGC 或 Shenandoah

你可能感兴趣的:(java,系统,jvm,垃圾回收)