如何将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_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。)
在这里插入图片描述

点击这里

在这里插入图片描述

最后大功告成。

在这里插入图片描述

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值