JITWatch查看反彙編的機器碼


或許曾經使用過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。壓縮包包含目錄結構,解壓縮後根據目錄結構放到JDK安裝目錄,進行覆蓋
  4. 安裝JITWatch(以maven方式爲例,也可使用gradle安裝)
    cd jitwatch
    mvn clean install -DskipTests=true
    
  5. 啓動JITWatch
    ./launchUI.bat
    
    在這裏插入圖片描述

安裝hsdis

  1. 下載編譯好的hsdis庫文件從網上下載已經編譯好的dll/so文件.提供windows下使用的dll庫文件:
    也可以參照build hsdis自行編譯庫文件
  2. 庫文件安裝到JDK 直接將.lib和.dll庫文件{jdk}\jre\bin\server目錄下

查看反彙編碼

  1. 創建JitWatcher類:代碼內容如下:
    只有複雜代碼纔會觸發JIT優化,否則Execution Engine直接解釋執行。因此要查看反彙編後的機器碼,需要一個足夠觸發JIT優化的複雜JAVA類

    package com.sw;	
    public class JitWatcher {
        public volatile long sum = 0;	
        public void simpleAdd(int x) {
            x++;
        }	
        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. 在開發平臺查看
    如需要在Eclipse或Intellij Idea控制檯輸出反彙編碼,添加以下VM options: Edit Condiguration – Configuration – VM options添加如下參數:

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

    XX:LogFile=E:/Jitlogfile.log是指定日誌輸出路徑,可以省略,其日誌內容同控制檯一致

    在Intellij Idea運行JitWatcher。由於剛纔配置的啓動參數,控制檯將會輸出反編譯後的機器碼
    JitWatcher運行效果

  3. 通過JITWatch界面查看
    3.1 點擊Sandbox–New Editor
    3.2 粘貼JitWatcher.java代碼內容
    3.3 點擊Configure Sandbox
    3.4 在Extra VM switches輸入一下內容

    -XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading -XX:+LogCompilation -XX:+PrintAssembly
    

    3.5 點擊save
    3.6 在Sandbox界面點擊save
    3.7 輸入要保存的文件名
    3.8 在Sandbox界面點擊Run
    3.9 查看源碼,字節碼,反彙編碼
    由於simpleAdd太簡單,沒有觸發JIT編譯器優化,因此沒有對應的反彙編碼生成
    在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章