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级大堆,适合金融极致低延迟场景 |
- Serial、Parallel 系列:新生代、老年代都负责。
- ParNew 只管新生代,CMS 只回收老年代,二者组合使用。
- G1、ZGC、Shenandoah:不严格划分物理新旧区,整堆统一分区回收。