欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JITWatch查看反汇编的机器码

程序员文章站 2022-07-12 20:15:04
...


或许曾经使用过javap查看过字节码,甚至还是用过“-XX:+PrintOptoAssembly”(用于服务端JVM)或“-XX:+PrintLIR”(用于客户端JVM)来输出比较接近最终结果的中间代码表示。接下来介绍一个实用图形化工具,可同时查看字节码和反汇编后的机器码(仅限于JIT优化后的代码)

JITWatch安装

  1. 下载JITWatch源码:https://github.com/AdoptOpenJDK/jitwatch
  2. 下载openjFX:https://chriswhocodes.com/downloads/openjfx-8-sdk-overlay-win-x64.zip
  3. 解压缩:openjfx-8-sdk-overlay-win-x64.zip
  4. 安装JITWatch(以maven方式为例,也可使用gradle安装)
    cd jitwatch
    mvn clean install -DskipTests=true
    
  5. 启动JITWatch
    ./launchUI.bat
    
    JITWatch查看反汇编的机器码

安装hsdis

  1. 下载编译好的hsdis库文件从网上下载已经编译好的dll/so文件.提供windows下使用的dll库文件:
    也可以参照build hsdis自行编译库文件
  2. 库文件安装到JDK 直接将.lib和.dll库文件{jdk}\jre\bin\server目录下

编写复杂JAVA类

只有复杂代码才会触发JIT优化,否则Execution Engine直接解释执行。因此要查看反汇编后的机器码,需要一个足够触发JIT优化的复杂JAVA类

  1. 创建JitWatcher类:打开Intellij Idea创建改类,代码内容如下:

    package com.sw;
    
    public class JitWatcher {
        public volatile long sum = 0;
    
        public int add(int x, int y) {
            int res = x + y;
            sum += res;
            return res;
        }
    
        public static void main(String[] args) {
            JitWatcher jitWatcher = new JitWatcher();
            int sum = 0;
            for (int i = 0; i < 1000000; i++) {
                sum = jitWatcher.add(sum, 1);
            }
            System.out.println("Sum:" + sum);
            System.out.println("JitWatcher.sum:" + jitWatcher.sum);
        }
    }
    
  2. 添加启动参数VM Options
    Edit Condiguration – Configuration – VM options添加如下参数:

    -XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading -XX:+LogCompilation -XX:LogFile=E:/Jitlogfile.log -XX:+PrintAssembly
    

    注意:E:/Jitlogfile.log是作者指定的日志输出文件,如有需要请适当修改

  3. 运行JitWatcher
    直接在Intellij Idea运行JitWatcher。由于刚才配置的启动参数,控制台将会输出反编译后的机器码
    JITWatch查看反汇编的机器码

JITWatch界面查看

1 通过Open Log打开日志
2 通过Config指定JitWatcher的源路径和class文件路径
3 点击Start运行
4 点击TriView以查看字节码和反汇编的机器码
JITWatch查看反汇编的机器码
5 查看字节码和反汇编码
Class指定要查看的类"com.sw.JitWatcher"
Member指定要查看的方法
JITWatch查看反汇编的机器码