如何将Java代码对应到字节码,最后到汇编?(HSDIS、JITWatch)

先看下效果

左边是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代码对应到字节码,最后到汇编?(HSDIS、JITWatch)_第1张图片

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

如图:

如何将Java代码对应到字节码,最后到汇编?(HSDIS、JITWatch)_第2张图片

执行main方法,验证:

如何将Java代码对应到字节码,最后到汇编?(HSDIS、JITWatch)_第3张图片

验证通过,下一步。

2.2、JITWatch

JITWatch 是 HSDIS 经常搭配使用的的可视化的编译日志分析工具。

2.2.1 下载

这里我使用的是直接下载源码,在本地编译使用。

源码地址 https://github.com/AdoptOpenJDK/jitwatch

2.2.2 编译启动

然后在 IDEA 中编译打开。

如何将Java代码对应到字节码,最后到汇编?(HSDIS、JITWatch)_第4张图片

勾选jdk 8 ,进行 maven 编译。

mvn clean compile test exec:java

如何将Java代码对应到字节码,最后到汇编?(HSDIS、JITWatch)_第5张图片

运行结果UI

如何将Java代码对应到字节码,最后到汇编?(HSDIS、JITWatch)_第6张图片

三、最终流程

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 源文件目录配置进去。

如何将Java代码对应到字节码,最后到汇编?(HSDIS、JITWatch)_第7张图片

如何将Java代码对应到字节码,最后到汇编?(HSDIS、JITWatch)_第8张图片

然后加载 log 文件

如何将Java代码对应到字节码,最后到汇编?(HSDIS、JITWatch)_第9张图片

如何将Java代码对应到字节码,最后到汇编?(HSDIS、JITWatch)_第10张图片

点击 start

如何将Java代码对应到字节码,最后到汇编?(HSDIS、JITWatch)_第11张图片

(如果没有出现,再一点下 start。)
如何将Java代码对应到字节码,最后到汇编?(HSDIS、JITWatch)_第12张图片

点击这里

如何将Java代码对应到字节码,最后到汇编?(HSDIS、JITWatch)_第13张图片

最后大功告成。

你可能感兴趣的:(JVM)