JVM GC 种类

JVM 中的垃圾回收器(GC)种类丰富,不同的 GC 在性能、延迟、吞吐方面各有优劣,适用于不同类型的应用程序场景。


✅ JVM 支持的主流 GC 列表

GC 名称启用参数首次引入版本是否分代特点 / 适用场景
Serial GC-XX:+UseSerialGCJava 1.2简单串行,适合小堆、小应用
Parallel GC-XX:+UseParallelGCJava 1.4吞吐优先,默认 JDK 8
CMS GC-XX:+UseConcMarkSweepGCJava 1.4低停顿,老年代并发回收,JDK 14 起被移除
G1 GC-XX:+UseG1GCJava 7(实验)
默认:JDK 9+
可控延迟,默认 JDK 11/17/21
ZGC-XX:+UseZGCJDK 11(实验)
JDK 15(正式)
✅(JDK 21 起支持分代)超低停顿,适合大堆、低延迟
Shenandoah GC-XX:+UseShenandoahGCJDK 12(实验)
JDK 15+(正式 in OpenJDK)
类似 ZGC,低延迟,可并发压缩
Epsilon GC-XX:+UseEpsilonGCJDK 11实验性 GC:不回收内存,用于性能测试

🧠 分类整理一下:

🔹 1. 传统 GC(Stop-the-World 为主)

GC特点
Serial GC单线程处理所有阶段,适合小程序
Parallel GC多线程处理,吞吐率高,适合批处理/后台服务

🔹 2. 低延迟 GC(并发回收为主)

GC特点
CMS GC老年代并发清除,但有碎片,已废弃
G1 GC分区设计,目标可控停顿时间,主流选择
ShenandoahOpenJDK 维护,并发压缩,停顿更短
ZGC极低停顿,TB 级堆支持,适合金融/游戏等低延迟场景

🔹 3. 实验性 GC

GC特点
Epsilon GC无任何垃圾回收,仅做基准测试
Generational ZGC分代版本的 ZGC,JDK 21+ 引入,仍在预览阶段

🎯 各 GC 的适用建议(简化版)

应用类型推荐 GC
小型 CLI 工具 / IoTSerial 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 8Parallel GC
JDK 9-14G1 GC
JDK 15+G1 GC(仍为默认)
JDK 17+G1 GC,但推荐 G1/ZGC
JDK 21G1 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 ZGCJDK 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值