如何将Java代码对应到字节码,最后到汇编?(HSDIS、JITWatch)
先看下效果左边是java代码,中间是字节码,右边是汇编。并且一一对应。一、使用的工具说明操作系统 MacOSJava 版本java version “1.8.0_231”IDE 使用 IntelliJ IDEA 2020.2 (使用其他完全可以)apache-maven-3.5.4反汇编 HSDIS查看工具 JITWatch二、准备工具重点准备后两个。2.1、HSDIS2.1.1、介绍HSDIS是
先看下效果
左边是java代码,中间是字节码,右边是汇编。并且一一对应。
一、使用的工具说明
- 操作系统 MacOS
- Java 版本 java version “1.8.0_231”
- IDE 使用 IntelliJ IDEA 2020.2 (使用其他完全可以)
- apache-maven-3.5.4
- 反汇编 HSDIS
- 查看工具 JITWatch
二、准备工具
重点准备后两个。
2.1、HSDIS
2.1.1、介绍
HSDIS是一个Sun官方推荐的HotSpot虚拟机JIT编译代码的反汇编插件,他包含在HotSpot虚拟机的源码之中,但没有提供编译后的程序。在Project Kenai的网站也可以下载到单独的源码。他的作用是让HotSpot的-XX : +PrintAssembly指令调用他来把动态生成的本地代码还原为汇编代码输出,同时还生成了大量非常有价值的注释,这样我们就可以通过输出的代码来分析问题。可以根据自己的操作系统和CPU类型从Project Kenai的网站上下载编译好的插件,直接放到JDK_HOME/jre/bin/server(JDK9以下)和JDK_HOME/lib/amd64/server(JDK9及或以上)目录中即可。
2.1.2、下载并配置
因为我使用的是JDK8,直接找到了,并下载。
https://github.com/liuzhengyang/hsdis
复制到的/%JAVA_HOME%/jre/lib/server/
目录,如图:
2.1.3、验证
在idea中测试一下效果。
测试代码:
package com.hyl.learnerJVM.assembly;
/**
* 反汇编测试
* <p>
*
* @author Hyl
* @version V 0.1
* @since 0.1 2020-08-01 10:42
*/
public class Bar {
int a = 1;
static int b = 2;
public int sum(int c) {
return a + b + c;
}
public static void main(String[] args) {
new Bar().sum(3);
}
}
添加 VM 参数配置:
-XX:+UnlockDiagnosticVMOptions
-XX:+PrintAssembly
-Xcomp
-XX:CompileCommand=dontinline,*Bar.sum
-XX:CompileCommand=compileonly,*Bar.sum
如图:
执行main方法,验证:
验证通过,下一步。
2.2、JITWatch
JITWatch 是 HSDIS 经常搭配使用的的可视化的编译日志分析工具。
2.2.1 下载
这里我使用的是直接下载源码,在本地编译使用。
源码地址 https://github.com/AdoptOpenJDK/jitwatch
2.2.2 编译启动
然后在 IDEA 中编译打开。
勾选jdk 8 ,进行 maven 编译。
mvn clean compile test exec:java
运行结果 UI
三、最终流程
3.1、测试代码
package com.hyl.learnerJVM.assembly;
/**
* 反汇编测试
* <p>
*
* @author Hyl
* @version V 0.1
* @since 0.1 2020-08-01 10:42
*/
public class Bar {
int a = 1;
static int b = 2;
public int sum(int c) {
return a + b + c;
}
public static void main(String[] args) {
new Bar().sum(3);
}
}
3.2、产生 HSDIS 的文件
之前验证 HSDIS 的时候,产生的汇编都是直接打印出来了,这里我们调整 vm 参数,使其产生到指定文件中。
-XX:+UnlockDiagnosticVMOptions
-XX:+TraceClassLoading
-XX:+LogCompilation
-Xcomp
-XX:CompileCommand=dontinline,*Bar.sum
-XX:CompileCommand=compileonly,*Bar.sum
-XX:+PrintAssembly
-XX:LogFile=/Users/huangyongliang/Downloads/files/logfile.log
产生文件。
3.3、在 JITWatch 中查看
在加载 log 之前,我们先将需要查看的 java 源文件目录配置进去。
然后加载 log 文件
点击 start
(如果没有出现,再一点下 start。)
点击这里
最后大功告成。
更多推荐
所有评论(0)