java -XX:+UseG1GC -Xlog:gc*:file=/tmp/gc.log:time,uptime -jar app.jar
java -XX:+PrintFlagsFinal -version | grep -i -E 'UseG1GC|MaxHeapSize'

服务从 JDK 8 升到 17,启动直接失败,输出 Unrecognized VM option 'UseConcMarkSweepGC',后面还有 PrintGCDetails 和 CMSInitiatingOccupancyFraction 两条。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,CMS 在 JDK 14 被移除,17 里这些参数不再是警告而是直接拒绝启动。老的 GC 日志参数也在 JDK 9 被 -Xlog 取代。

围绕「JVM 参数废弃」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

报错里带路径的,先去看那个路径在不在、权限对不对。同一份配置存在多处的,先确认改的是被加载的那一份。

处理上按这个顺序:把 UseConcMarkSweepGC 换成 UseG1GC 或 UseZGC;PrintGCDetails 一类换成 -Xlog:gc*;CMS 专属参数整段删掉 不要留着试;用 java -XX:+PrintFlagsFinal 核对剩余参数是否被识别。

改完只确认一件事:启动日志里没有 Unrecognized VM option 进程正常起来 gc.log 有内容。

作者 9823189