JVM参数-XX:CompileCommand=exclude失效,如何阻止指定方法JIT编译?
如何阻止指定方法被JIT编译
针对你遇到的-XX:CompileCommand=exclude未生效的问题,可按以下步骤排查解决:
1. 精准匹配方法签名
JVM的CompileCommand默认仅匹配方法名,若目标方法存在重载,需指定完整方法签名才能精准排除。从JFR事件可见,被编译的方法是String com.alibaba.fastjson.parser.SymbolTable.addSymbol(char[], int, int, int),因此需修改参数为:
-XX:CompileCommand=exclude,com/alibaba/fastjson/parser/JSONLexerBase::scanSymbol \ -XX:CompileCommand=exclude,com/alibaba/fastjson/parser/SymbolTable::addSymbol(char[],int,int,int)
注意:参数间不要加空格,基本类型用原生缩写(如int、char[]),引用类型需写全限定类名。
2. 批量排除重载方法
若要排除该类下所有名为addSymbol的重载方法,可使用通配符简化命令:
-XX:CompileCommand=exclude,*,com/alibaba/fastjson/parser/SymbolTable::addSymbol
如果需要禁用整个类的JIT编译,可写为:
-XX:CompileCommand=exclude,com/alibaba/fastjson/parser/SymbolTable::*
3. 验证命令是否生效
添加-XX:+PrintCompileCommands参数启动应用,控制台会打印所有生效的编译命令。若看到类似如下输出,说明排除规则已成功加载:
Excluding compile: com/alibaba/fastjson/parser/SymbolTable::addSymbol(char[],int,int,int)
若未输出对应内容,需检查命令格式是否有误。
4. 排查冲突参数
确保应用启动参数中没有以下干扰项:
- 存在
-XX:CompileCommand=include命令覆盖了exclude规则; - 启用了其他编译器(如
-XX:+UseJVMCICompiler)导致规则不生效; - 模块化项目中未指定模块名(若FastJSON以模块方式引入,需添加模块前缀:
-XX:CompileCommand=exclude,模块名/com/alibaba/fastjson/parser/SymbolTable::addSymbol(...))。
5. 确认最终效果
应用启动后,可通过jcmd <进程ID> compiler.codecache命令查看已编译方法列表,确认目标方法未出现在其中,或再次通过JFR验证是否还有该方法的C2编译事件。
内容的提问来源于stack exchange,提问作者FlyChenKai
相关产品推荐
相关产品推荐

