JITWatch查看反汇编的机器码
程序员文章站
2022-07-12 20:15:04
...
JITWatch安装与使用
或许曾经使用过javap查看过字节码,甚至还是用过“-XX:+PrintOptoAssembly”(用于服务端JVM)或“-XX:+PrintLIR”(用于客户端JVM)来输出比较接近最终结果的中间代码表示。接下来介绍一个实用图形化工具,可同时查看字节码和反汇编后的机器码(仅限于JIT优化后的代码)
JITWatch安装
- 下载JITWatch源码:https://github.com/AdoptOpenJDK/jitwatch
- 下载openjFX:https://chriswhocodes.com/downloads/openjfx-8-sdk-overlay-win-x64.zip
- 解压缩:openjfx-8-sdk-overlay-win-x64.zip
-
安装JITWatch(以maven方式为例,也可使用gradle安装)
cd jitwatch mvn clean install -DskipTests=true
-
启动JITWatch:
./launchUI.bat
安装hsdis
-
下载编译好的hsdis库文件从网上下载已经编译好的dll/so文件.提供windows下使用的dll库文件:
也可以参照build hsdis自行编译库文件 - 库文件安装到JDK 直接将.lib和.dll库文件{jdk}\jre\bin\server目录下
编写复杂JAVA类
只有复杂代码才会触发JIT优化,否则Execution Engine直接解释执行。因此要查看反汇编后的机器码,需要一个足够触发JIT优化的复杂JAVA类
-
创建JitWatcher类:打开Intellij Idea创建改类,代码内容如下:
package com.sw; public class JitWatcher { public volatile long sum = 0; public int add(int x, int y) { int res = x + y; sum += res; return res; } public static void main(String[] args) { JitWatcher jitWatcher = new JitWatcher(); int sum = 0; for (int i = 0; i < 1000000; i++) { sum = jitWatcher.add(sum, 1); } System.out.println("Sum:" + sum); System.out.println("JitWatcher.sum:" + jitWatcher.sum); } }
-
添加启动参数VM Options
Edit Condiguration – Configuration – VM options添加如下参数:-XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading -XX:+LogCompilation -XX:LogFile=E:/Jitlogfile.log -XX:+PrintAssembly
注意:E:/Jitlogfile.log是作者指定的日志输出文件,如有需要请适当修改
-
运行JitWatcher
直接在Intellij Idea运行JitWatcher。由于刚才配置的启动参数,控制台将会输出反编译后的机器码
JITWatch界面查看
1 通过Open Log打开日志
2 通过Config指定JitWatcher的源路径和class文件路径
3 点击Start运行
4 点击TriView以查看字节码和反汇编的机器码
5 查看字节码和反汇编码
Class指定要查看的类"com.sw.JitWatcher"
Member指定要查看的方法
推荐阅读