JVM 中的垃圾回收器(GC)种类丰富,不同的 GC 在性能、延迟、吞吐方面各有优劣,适用于不同类型的应用程序场景。
✅ JVM 支持的主流 GC 列表
GC 名称 | 启用参数 | 首次引入版本 | 是否分代 | 特点 / 适用场景 |
---|---|---|---|---|
Serial GC | -XX:+UseSerialGC | Java 1.2 | ✅ | 简单串行,适合小堆、小应用 |
Parallel GC | -XX:+UseParallelGC | Java 1.4 | ✅ | 吞吐优先,默认 JDK 8 |
CMS GC | -XX:+UseConcMarkSweepGC | Java 1.4 | ✅ | 低停顿,老年代并发回收,JDK 14 起被移除 |
G1 GC | -XX:+UseG1GC | Java 7(实验) 默认:JDK 9+ | ✅ | 可控延迟,默认 JDK 11/17/21 |
ZGC | -XX:+UseZGC | JDK 11(实验) JDK 15(正式) | ✅(JDK 21 起支持分代) | 超低停顿,适合大堆、低延迟 |
Shenandoah GC | -XX:+UseShenandoahGC | JDK 12(实验) JDK 15+(正式 in OpenJDK) | ✅ | 类似 ZGC,低延迟,可并发压缩 |
Epsilon GC | -XX:+UseEpsilonGC | JDK 11 | ❌ | 实验性 GC:不回收内存,用于性能测试 |
🧠 分类整理一下:
🔹 1. 传统 GC(Stop-the-World 为主)
GC | 特点 |
---|---|
Serial GC | 单线程处理所有阶段,适合小程序 |
Parallel GC | 多线程处理,吞吐率高,适合批处理/后台服务 |
🔹 2. 低延迟 GC(并发回收为主)
GC | 特点 |
---|---|
CMS GC | 老年代并发清除,但有碎片,已废弃 |
G1 GC | 分区设计,目标可控停顿时间,主流选择 |
Shenandoah | OpenJDK 维护,并发压缩,停顿更短 |
ZGC | 极低停顿,TB 级堆支持,适合金融/游戏等低延迟场景 |
🔹 3. 实验性 GC
GC | 特点 |
---|---|
Epsilon GC | 无任何垃圾回收,仅做基准测试 |
Generational ZGC | 分代版本的 ZGC,JDK 21+ 引入,仍在预览阶段 |
🎯 各 GC 的适用建议(简化版)
应用类型 | 推荐 GC |
---|---|
小型 CLI 工具 / IoT | Serial GC |
大数据批处理 | Parallel GC |
一般 Web 应用 | G1 GC(默认) |
高吞吐服务 | Parallel GC / G1 GC |
低延迟系统(游戏、金融、广告) | ZGC / Shenandoah |
性能测试 / 控制实验 | Epsilon GC |
🧪 如何查看当前使用的 GC?
运行:
java -XX:+PrintCommandLineFlags -version
或加日志参数:
java -Xlog:gc* ...
🔷 JDK 各版本默认 GC
JDK 版本 | 默认 GC |
---|---|
JDK 8 | Parallel GC |
JDK 9-14 | G1 GC |
JDK 15+ | G1 GC(仍为默认) |
JDK 17+ | G1 GC,但推荐 G1/ZGC |
JDK 21 | G1 GC,生产推荐 G1/ZGC |
🧭 主流 GC 的优缺点
GC 名称 | JDK 可用版本 | 优点 | 缺点 |
---|---|---|---|
Serial GC (UseSerialGC ) | JDK 8+ | 简单、适合小堆、小应用 | 单线程、停顿时间长,吞吐低 |
Parallel GC (UseParallelGC ) | JDK 8+(JDK 8 默认) | 吞吐高、并行处理新/老年代 | 停顿时间仍然较长,响应性差 |
CMS GC (UseConcMarkSweepGC ) | JDK 8~14(JDK 14 被移除) | 并发回收老年代,减少停顿 | 内存碎片、Full GC 慢、维护复杂,已废弃 |
G1 GC (UseG1GC ) | JDK 9+(JDK 11 默认) | 停顿可控(目标停顿时间)、可并发老年代回收 | 吞吐比 Parallel 差、大对象分配较慢、Full GC 仍慢 |
ZGC (UseZGC ) | JDK 11+(JDK 15 稳定) | 极低延迟(<10ms),TB 级堆支持,线程不 STW | 吞吐略低、旧版对小堆表现差、复杂 |
Shenandoah GC (UseShenandoahGC ) | JDK 12+(部分 OpenJDK) | 低延迟(10ms 级),并发压缩 | 吞吐比 G1 略低,未集成在 Oracle JDK(仅 OpenJDK) |
Generational ZGC | JDK 21+(预览) | ZGC 分代,进一步提升吞吐 | 尚属预览,生产不建议直接使用 |
📌 详细解释
1. Serial GC
-
✅ 优点:
- 实现简单,单线程,开销小。
- 适合小内存应用(如 IoT)。
-
❌ 缺点:
- Full GC 会长时间 Stop-The-World(STW)。
- 只能单线程处理回收,效率极低。
2. Parallel GC(吞吐量优先 GC)
-
✅ 优点:
- 多线程处理新生代和老年代,吞吐率高。
- 默认用于 JDK 8。
-
❌ 缺点:
- 停顿时间不可控,尤其 Full GC 会长时间 STW。
- 不适合对响应延迟敏感的服务。
3. CMS(Concurrent Mark-Sweep)GC ❗已废弃
-
✅ 优点:
- 并发回收老年代,降低长时间停顿。
-
❌ 缺点:
- 不能整理内存,容易产生碎片。
- 若回收不及时,仍会 Full GC,导致长时间 STW。
- 维护复杂,已于 JDK 14 被官方移除。
4. G1 GC(Garbage-First GC)
-
✅ 优点:
- 区域化堆结构(Region),支持部分回收。
- 停顿目标可配置(如
-XX:MaxGCPauseMillis=200
)。 - 并发标记、并发回收老年代。
-
❌ 缺点:
- 吞吐不如 Parallel GC。
- 大对象分配慢。
- Full GC 性能仍差。
5. ZGC(Z Garbage Collector)
-
✅ 优点:
- 低延迟(<10ms),对线程影响极小。
- 支持 TB 级堆(最大16TB+)。
- 并发所有阶段(标记、压缩、清理)。
-
❌ 缺点:
- 吞吐略低。
- 小堆下收益不明显。
- 旧版本不支持 Windows(JDK 15+ 才好用)。
6. Shenandoah GC
-
✅ 优点:
- 低延迟(10ms 级别)。
- 支持并发压缩(整理),避免碎片。
-
❌ 缺点:
- 吞吐率比 G1 稍差。
- 并不包含在 Oracle JDK,主要在 OpenJDK/Red Hat 构建中提供。
- 与某些 native 内存结构不兼容。
7. Generational ZGC(分代 ZGC)
-
✅ 优点:
- 保留 ZGC 低延迟的优点。
- 引入分代,提高了吞吐率。
-
❌ 缺点:
- JDK 21 为预览功能,不稳定,不推荐生产使用。
🧩 如何选择 GC?
场景 | 建议 GC |
---|---|
小型应用、CLI 工具 | Serial GC |
后台批处理、计算密集型 | Parallel GC |
通用 Web 服务(JDK11+) | G1 GC(默认即可) |
超大内存、低延迟要求系统 | ZGC 或 Shenandoah |
自己管理 OpenJDK,可调优低延迟 | Shenandoah GC |