IDEA查看运行Java代码生成的汇编指令
IDEA 查看运行 Java 代码生成的汇编指令
方式一: HSDIS
一、安装
- 下载地址: hsdis-amd64.dll,提取码:ssmy
- 把 hsdis-amd64.dll 放在 $JAVA_HOME/jre/bin/server 目录下
- 运行时添加参数:
-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly
二、IDEA 运行添加 VM options
![](/2020/09/21/IDEA%E6%9F%A5%E7%9C%8B%E8%BF%90%E8%A1%8CJava%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E7%9A%84%E6%B1%87%E7%BC%96%E6%8C%87%E4%BB%A4/2020-09-21-15-44-40.png)
![](/2020/09/21/IDEA%E6%9F%A5%E7%9C%8B%E8%BF%90%E8%A1%8CJava%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E7%9A%84%E6%B1%87%E7%BC%96%E6%8C%87%E4%BB%A4/2020-09-21-15-48-43.png)
方式二: jitwatch
AdoptOpenJDK/jitwatch 一个用于分析汇编日志的图形界面工具.
一、安装
操作步骤:
- 拉取源码
- 编译源码
- 启动
1.拉取源码
git clone https://github.com/AdoptOpenJDK/jitwatch.git
2.编译源码
mvn clean compile test exec:java
NOTE:
ant clean compile test run
>gradlew clean build run
以上两种工具也可! 选择自己顺手的
不出意外的话,你将会看到一个自动弹出的工具界面:
![](/2020/09/21/IDEA%E6%9F%A5%E7%9C%8B%E8%BF%90%E8%A1%8CJava%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E7%9A%84%E6%B1%87%E7%BC%96%E6%8C%87%E4%BB%A4/2020-09-21-16-00-19.png)
3.启动
编译成功后,jitwatch 目录下会生成一些脚本文件,其中launchUI.bat
就是 windows 平台下的启动脚本.因此,下次启动该工具直接双击该批处理文件即可.
NOTE:
launchUI.sh
为 linux 平台下的启动脚本.
![](/2020/09/21/IDEA%E6%9F%A5%E7%9C%8B%E8%BF%90%E8%A1%8CJava%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E7%9A%84%E6%B1%87%E7%BC%96%E6%8C%87%E4%BB%A4/2020-09-21-16-05-01.png)
二、使用
1. 配置源码目录和编译字节码目录
![](/2020/09/21/IDEA%E6%9F%A5%E7%9C%8B%E8%BF%90%E8%A1%8CJava%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E7%9A%84%E6%B1%87%E7%BC%96%E6%8C%87%E4%BB%A4/2020-09-21-16-41-29.png)
2.打开生成的 hotspot.log 文件
具体 jvm 参数参见附录 1.
![](/2020/09/21/IDEA%E6%9F%A5%E7%9C%8B%E8%BF%90%E8%A1%8CJava%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E7%9A%84%E6%B1%87%E7%BC%96%E6%8C%87%E4%BB%A4/2020-09-21-16-44-02.png)
![](/2020/09/21/IDEA%E6%9F%A5%E7%9C%8B%E8%BF%90%E8%A1%8CJava%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E7%9A%84%E6%B1%87%E7%BC%96%E6%8C%87%E4%BB%A4/2020-09-21-16-44-23.png)
![](/2020/09/21/IDEA%E6%9F%A5%E7%9C%8B%E8%BF%90%E8%A1%8CJava%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E7%9A%84%E6%B1%87%E7%BC%96%E6%8C%87%E4%BB%A4/2020-09-21-16-45-50.png)
![](/2020/09/21/IDEA%E6%9F%A5%E7%9C%8B%E8%BF%90%E8%A1%8CJava%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E7%9A%84%E6%B1%87%E7%BC%96%E6%8C%87%E4%BB%A4/2020-09-21-16-59-40.png)
附录
- Jvm 参数:Java Platform, Standard Edition Tools Reference
本文涉及到的常用参数:
参数 | 解释 |
---|---|
-XX:+UnlockDiagnosticVMOptions | 解锁用于 JVM 诊断的选项 |
-XX:+PrintAssembly | 配合反汇编插件(例如 hsdis-amd64.dylib)可以打印出字节码和本地方法的汇编码;必须和 -XX:+UnlockDiagnosticVMOptions 一起使用。 |
-Xcomp | 在第一次调用时强制编译方法。默认情况下,无论是 -client 模式还是 -server 模式,都需要执行一定次数解释方法的调用才会触发方法的编译。(如果需要 JIT 日志,则不指定该参数) |
-XX:CompileCommand=compileonly,*ClassName.methodName: | 只编译类名为 ClassName 中的 methodName 方法,支持使用 * 作为通配符。可以多次指定 -XX:CompileCommand 添加多条命令。(建议只指定需要的方法,否则将会产生大量的无关日志) |
-XX:+LogCompilation: | 允许将编译活动记录到当前工作目录中名为 hotspot.log 的文件中。可以通过 -XX:LogFile 指定文件的路径和名字。 |
-XX:LogFile=path: | 指定日志的路径和文件名。例如:-XX:LogFile=/var/log/hotspot.log |
例子:
-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -Xcomp -XX:CompileCommand=compileonly,*VolatileTest.increase -XX:CompileCommand=compileonly,*VolatileTest.decrease -XX:+LogCompilation -XX:LogFile=F:/opt/log/hotspot.log
参考
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!