如何将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))
文章图片

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))
文章图片

执行main方法,验证:
如何将Java代码对应到字节码,最后到汇编((HSDIS、JITWatch))
文章图片

验证通过,下一步。
2.2、JITWatch
JITWatch 是 HSDIS 经常搭配使用的的可视化的编译日志分析工具。
2.2.1 下载 这里我使用的是直接下载源码,在本地编译使用。
源码地址 https://github.com/AdoptOpenJDK/jitwatch
2.2.2 编译启动 然后在 IDEA 中编译打开。
如何将Java代码对应到字节码,最后到汇编((HSDIS、JITWatch))
文章图片

勾选jdk 8 ,进行 maven 编译。
mvn clean compile test exec:java

【如何将Java代码对应到字节码,最后到汇编((HSDIS、JITWatch))】如何将Java代码对应到字节码,最后到汇编((HSDIS、JITWatch))
文章图片

运行结果UI
如何将Java代码对应到字节码,最后到汇编((HSDIS、JITWatch))
文章图片

三、最终流程 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

产生文件。
如何将Java代码对应到字节码,最后到汇编((HSDIS、JITWatch))
文章图片

3.3、在 JITWatch 中查看
在加载 log 之前,我们先将需要查看的 java 源文件目录配置进去。
如何将Java代码对应到字节码,最后到汇编((HSDIS、JITWatch))
文章图片

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

然后加载 log 文件
如何将Java代码对应到字节码,最后到汇编((HSDIS、JITWatch))
文章图片

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

点击 start
如何将Java代码对应到字节码,最后到汇编((HSDIS、JITWatch))
文章图片

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

点击这里
如何将Java代码对应到字节码,最后到汇编((HSDIS、JITWatch))
文章图片

最后大功告成。

    推荐阅读