先看下效果 左边是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
复制到的目录,如图:
文章图片
2.1.3、验证 在idea中测试一下效果。
测试代码:
package com.hyl.learnerJVM.assembly;
/**
* 反汇编测试
* *
* @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
【如何将Java代码对应到字节码,最后到汇编((HSDIS、JITWatch))】
文章图片
运行结果UI
文章图片
三、最终流程 3.1、测试代码
package com.hyl.learnerJVM.assembly;
/**
* 反汇编测试
* *
* @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。)
文章图片
点击这里
文章图片
最后大功告成。
推荐阅读
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- jvm|JVM调优(线上 JVM GC 频繁耗时长,出现 LongGC 告警,这次排查后想说:还有谁(...))
- java内存区域与内存溢出异常
- JVM|JVM优化(一)
- 自动内存管理机制
- JVM: 使用 jstack 命令找出 cpu 飙高的原因
- java|JVM之字节码如何在jvm流转
- jvm|从栈帧看字节码是如何在 JVM 中进行流转的
- java|[NIO和Netty] NIO和Netty系列(二): Java Reference详解
- 生活|jrebeleclipse/tomcat 使用方法