JVM垃圾回收器速览

1. Serial 串行收集器

  • 新生代:标记复制 | 老年代:标记整理

  • 单线程回收,全程STW

  • 特点:简单、内存占用小、效率低

  • 适用:客户端、桌面程序、低配置单机

2. Parallel 并行收集器(JDK8默认)

  • 新生代(Parallel):标记 - 复制
  • 老年代(Parallel Old):标记 - 整理
  • 多线程并行GC,全程STW
  • 目标:最大化吞吐量,减少资源消耗
  • 缺点:单次STW耗时较长,延迟不稳定
  • 适用:后台批量业务、非高并发、对延迟不敏感服务

3. CMS 并发收集器

  • 只回收老年代(CMS 不能单独用,必须搭配 ParNew)

  • 并发标记、低延迟,主打最短停顿时间

  • 回收算法:老年代标记清除,会产生内存碎片

  • 分为:初始标记(STW)、并发标记、预清理、最终标记(STW)、并发清除

  • 缺点:产生内存碎片、并发浮动垃圾、CPU占用高

  • 适用:高响应、低延迟Web服务

4. G1 收集器(JDK9+默认)

  • 分区式回收,将堆拆分为多个大小一致Region,不分新⽣代 / ⽼年代物理区,按 Region 回收
  • 整体算法:标记 - 整理
  • 核心特点:可预测停顿时间、兼顾吞吐量与低延迟
  • 优先回收垃圾最多的Region,收益最高
  • 适用:大内存、中端线上服务

5. Shenandoah 收集器

  • 低延迟极致优化,几乎全程并发

  • 支持并发整理、并发压缩,STW极短

  • 算法:并发标记 + 并发整理

  • 代价:CPU资源消耗高、吞吐量下降

  • 适用:极致低延迟金融、支付核心服务

6. ZGC 收集器(JDK11+)

  • 超低延迟垃圾收集器,STW 毫秒级

  • 支持TB级大堆内存、几乎不随堆变大增加停顿时间

  • 基于染色指针、读写屏障实现并发回收

  • 算法:标记 - 复制(染色指针)

  • 适用:高并发、大内存、极致低延迟线上核心服务

对比

垃圾收集器 负责新生代 负责老年代 使用垃圾回收算法 核心特点
Serial ✅ 是 ✅ 是 新生代:标记复制
老年代:标记整理
单线程回收、全程STW、轻量简单,适合客户端小内存
Parallel / Parallel Old ✅ 是 ✅ 是 新生代:标记复制
老年代:标记整理
多线程并行、吞吐量优先,JDK8 默认,适合后台批处理
ParNew ✅ 是 ❌ 否 标记复制 多线程版 Serial,专门配合 CMS 工作
CMS ❌ 否 ✅ 只做老年代 标记-清除 并发低延迟、有内存碎片、产生浮动垃圾,必须搭配 ParNew
G1 统一管理整堆 统一管理整堆 整体:标记整理
局部Region:标记复制
按Region分区、可预测STW停顿、兼顾吞吐与延迟,JDK9+默认
ZGC / Shenandoah 统一管理整堆 统一管理整堆 并发标记 + 读写屏障
ZGC 基于染色指针
毫秒级超低STW、支持TB级大堆,适合金融极致低延迟场景
  1. Serial、Parallel 系列:新生代、老年代都负责
  2. ParNew 只管新生代,CMS 只回收老年代,二者组合使用。
  3. G1、ZGC、Shenandoah:不严格划分物理新旧区,整堆统一分区回收