手动配置jvm垃圾回收器需指定gc算法(如-xx:+useg1gc)、固定堆大小(-xms/-xmx)及日志参数(jdk10+用-xlog:gc,jdk8用-xx:+printgcdetails等),再通过启动日志、gc.log内容或jstat -gc实时验证是否生效。

手动配置JVM垃圾回收器,核心是通过启动参数指定GC算法、堆内存大小及日志输出,再结合日志分析验证是否生效。关键不在于“选哪个”,而在于“为什么选这个”以及“怎么确认它真在运行”。
明确目标GC类型并设置对应参数
JDK 8及以后版本中,不同GC有专属开关,不能混用。例如:
- G1 GC(默认推荐):无需额外参数(JDK9+默认),JDK8需显式加 -XX:+UseG1GC
- ZGC(低延迟,JDK11+):加 -XX:+UseZGC,还需 -XX:+UnlockExperimentalVMOptions(JDK11/12)
- Shenandoah(JDK12+):加 -XX:+UseShenandoahGC,同样需解锁实验选项
- Parallel GC(吞吐量优先):加 -XX:+UseParallelGC(JDK8默认)
- CMS(已废弃,JDK14移除):仅限JDK8/9,用 -XX:+UseConcMarkSweepGC
注意:同一JVM进程只能启用一种主要GC,参数冲突会导致启动失败(如同时写 -XX:+UseG1GC 和 -XX:+UseParallelGC)。
配套设置堆与GC日志,让行为可观察
只开GC算法不够,必须配日志才能验证。推荐组合:
- 基础日志:-Xlog:gc*:stdout:time,uptime,level,tags(JDK10+统一日志框架)
- 兼容旧版(JDK8):-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log
- 堆大小建议同步设定,避免默认值干扰判断:-Xms512m -Xmx512m(固定大小便于分析GC频率)
例如完整启动命令:
java -XX:+UseG1GC -Xms1g -Xmx1g -Xlog:gc*:file=gc.log:time,uptime,level,tags MyApp
检查日志确认GC实际运行
启动后查看日志文件或控制台输出,重点识别三类信息:
- 启动时提示:JVM会打印类似 Using G1 或 Using Parallel 的初始化日志
- GC事件标记:G1日志含 GC pause (G1 Evacuation Pause);Parallel日志含 PSYoungGen、ParOldGen
- 停顿时间与回收效果:对比 Pause time(毫秒级)和 After: 内存占用,判断是否符合预期(如ZGC应稳定在10ms内)
若日志中出现 Unrecognized VM option 或无GC记录,说明参数无效或应用未触发GC(可强制调用 System.gc() 测试,但仅用于验证)。
用jstat实时验证运行时状态
不依赖日志,可动态观察:
- 查进程ID:jps -l
- 查看GC统计:jstat -gc
1s (每秒刷新) - 关键字段含义:S0C/S1C(Survivor容量)、EC(Eden)、OC(Old)、GCT(总GC时间)、FGCT(Full GC耗时)
例如输出中 GCT=0.234 且 FGCT=0.000,说明已发生多次GC但未触发Full GC,符合G1/ZGC设计预期。











