JITWatch安裝與使用
或許曾經使用過javap查看過字節碼,甚至還是用過“-XX:+PrintOptoAssembly”(用於服務端JVM)或“-XX:+PrintLIR”(用於客戶端JVM)來輸出比較接近最終結果的中間代碼表示。接下來介紹一個實用圖形化工具,可同時查看字節碼和反彙編後的機器碼(僅限於JIT優化後的代碼)
JITWatch安裝
- 下載JITWatch源碼:https://github.com/AdoptOpenJDK/jitwatch
- 下載openjFX:https://chriswhocodes.com/downloads/openjfx-8-sdk-overlay-win-x64.zip
- 解壓縮:openjfx-8-sdk-overlay-win-x64.zip。壓縮包包含目錄結構,解壓縮後根據目錄結構放到JDK安裝目錄,進行覆蓋
- 安裝JITWatch(以maven方式爲例,也可使用gradle安裝)
cd jitwatch mvn clean install -DskipTests=true
- 啓動JITWatch:
./launchUI.bat
安裝hsdis
- 下載編譯好的hsdis庫文件從網上下載已經編譯好的dll/so文件.提供windows下使用的dll庫文件:
也可以參照build hsdis自行編譯庫文件 - 庫文件安裝到JDK 直接將.lib和.dll庫文件{jdk}\jre\bin\server目錄下
查看反彙編碼
-
創建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); } }
-
在開發平臺查看
如需要在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。由於剛纔配置的啓動參數,控制檯將會輸出反編譯後的機器碼
-
通過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編譯器優化,因此沒有對應的反彙編碼生成