Hotspot VM 使用 HSDIS 插件反汇编编译后的本地机器码:
下载 HSDIS-amd64.dll
HSDIS-amd64.dll 存放位置:{JAVA_HOME}/jre/bin/server
反汇编JVM 参数:
-Xcomp
-XX:+UnlockDiagnosticVMOptions
-XX:+PrintAssembly
-XX:CompileCommand=dontinline,*类名.方法名
-XX:CompileCommand=compileonly,*类名.方法名
例子:
-Xcomp
-XX:+UnlockDiagnosticVMOptions
-XX:+TraceClassLoading
-XX:+PrintAssembly
-XX:CompileCommand=dontinline,*NewVolatileTest.test
-XX:CompileCommand=compileonly,*NewVolatileTest.test
-XX:+LogCompilation
-XX:LogFile=jit.log
// 后两个参数配置了输出日志,是为了下面配合 JITWatch 分析。
参数解释:
-Xcomp:让 JVM 以编译模式执行代码,这样就不需要执行足够次数来预热即可触发即时编译
-XX:+PrintAssembly:输出反汇编得到的汇编代码
-XX:CompileCommand=dontinline,类名.方法名:不内联指定类的指定方法
-XX:CompileCommand=compileonly,类名.方法名:只编译指定类的指定方法
HSDIS 配合 JITWatch 分析反汇编结果:
1、https://github.com/AdoptOpenJDK/jitwatch clone JITWatch 源码;
2、在 JITWatch 源码路径下执行 mvn clean install -Dmaven.test.skip=true,跳过测试;
3、启动 JITWatch,使用 launchUI.bat 命令打开 JITWatch 即可;
4、程序添加 JVM 日志相关参数:-XX:+LogCompilation -XX:LogFile=jit.log,执行后反汇编结果会保存到日志中;
5、使用 JITWatch Open Log 打开 -XX:LogFile 指定的文件,Config 配置下源代码和编译后 class 文件的路径(只需配置路径即可),
Start 启动下,最后看 TriView,或者直接找到目标类的目标方法点开即可看到源代码、字节码以及汇编代码的对应关系。