JVM垃圾回收器通过-XX:+UseXXXGC参数指定,需按JDK版本选型:JDK 8默认Parallel、支持G1;JDK 9+默认G1;JDK 11+支持ZGC(实验→生产);JDK 17+ ZGC/Shenandoah生产就绪;CMS在JDK 14彻底移除。

Java 中通过 JVM 启动参数指定垃圾回收器,核心是使用 -XX:+UseXXXGC 系列开关。不同 JDK 版本支持的回收器不同,需注意兼容性(尤其是 JDK 8、11、17 的差异)。
常见回收器对应参数(JDK 8–17 主流用法)
以下参数在启动 Java 应用时添加到 java 命令中,例如:java -XX:+UseG1GC -jar app.jar
-
G1(Garbage-First):默认(JDK 9+),推荐用于大堆(4GB+)、低延迟场景
-XX:+UseG1GC(JDK 8u40+、JDK 9 及以后均支持) -
Parallel(吞吐量优先):JDK 8 默认,适合后台批处理、无明显延迟要求
-XX:+UseParallelGC(也等价于-XX:+UseParallelOldGC,两者自动联动) -
ZGC(超低延迟):JDK 11 引入(实验性),JDK 15+ 生产就绪
-XX:+UseZGC(需配合-XX:+UnlockExperimentalVMOptions在 JDK 11–14) -
Shenandoah:JDK 12 引入(实验性),JDK 15+ 生产就绪
-XX:+UseShenandoahGC(JDK 12–14 需加-XX:+UnlockExperimentalVMOptions) -
Serial / CMS(已废弃):
-XX:+UseSerialGC(单线程,小内存、客户端场景)-XX:+UseConcMarkSweepGC(JDK 9 已弃用,JDK 14 彻底移除)
切换前必须注意的冲突规则
JVM 不允许同时启用多个“主回收器”参数,否则启动失败。例如:
- 不能同时写
-XX:+UseG1GC -XX:+UseParallelGC(报错:Conflicting collector combinations) -
-XX:+UseG1GC会自动禁用 Parallel、CMS、Serial 等其他 GC 开关 - 部分参数隐式启用配套行为,如
-XX:+UseG1GC自动开启-XX:+UseStringDeduplication(可手动关闭)
如何确认当前生效的 GC?
启动时加参数输出 GC 信息,快速验证是否切换成功:
-
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps:打印详细 GC 日志(含回收器名称) -
-Xlog:gc*:file=gc.log:time(JDK 10+ 统一日志框架):更清晰显示 GC 类型,如[gc,heap] GC(0) Garbage Collection (G1 Evacuation Pause) - 运行时查:用
jstat -gc,若输出含GGC(G1 Young)、OGC(G1 Old)字段,说明 G1 生效;若为YGC/FGC则大概率是 Parallel 或 Serial
版本适配建议(避免踩坑)
不同 JDK 版本对 GC 参数支持差异大,选型前务必核对:
- JDK 8:支持 Serial、Parallel、CMS、G1;CMS 是当时主要低延迟选项(但已淘汰)
- JDK 9–10:G1 成为默认,CMS 标记为废弃
- JDK 11:ZGC 实验性引入,G1 仍是默认
- JDK 17(LTS):ZGC、Shenandoah 均为生产就绪,默认仍为 G1;CMS 完全不可用
- JDK 21(LTS):继续强化 ZGC/Shenandoah,G1 优化持续增强
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











