Java 性能分析工具 JITWatch 配置與使用
在當今軟件開發領域,性能優化成為了提升應用質量和用戶體驗的重要環節。JITWatch 作為一款強大的工具,能夠幫助開發者深入了解 Java 應用的即時編譯(Just-In-Time Compilation, JIT)過程,從而有效識別和解決性能瓶頸。本文旨在為初學者提供一個全面而簡潔的 JITWatch 上手指南,通過實際案例和詳細步驟介紹如何利用這一工具進行高效的性能分析與優化。
快速上手JITWatch
1. 下載與配置
我們首先需要到GitHub上下載對應的源碼包,對應的地址為:https://github.com/AdoptOpenJDK/jitwatch
需要注意的是1.4.2以上的版本可能存在亂碼的情況,所以我們建議clone的時候盡量選擇1.4.2及以下的版本,這里筆者也給出自己的克隆指令:
git clone --branch 1.4.1 git@github.com:AdoptOpenJDK/jitwatch.git
完成之后,我們還需要進行hsdis的下載安裝。
完成下載之后,我們只需要將其放到系統jdk目錄的\jre\bin\server目錄下:
2. 基礎使用演示
通過上述步驟我們完成了最基礎的配置和安裝,接下來我們就來一個比較基礎的演示,我們到jitwatch目錄下執行如下命令啟動程序:
mvn clean compile test exec:java
完成啟動后我們點擊sandbox:
點擊后我們可以看到一個基礎的帶有基本代碼示例的界面,我們點擊配置:
然后勾選顯示反編譯和顯示Intel的匯編碼,完成后點擊save:
完成這些配置后,回到默認界面我們直接點擊run,即可看到對應的字節碼和匯編碼指令:
3. 基于jitwatch了解volatile可見性的匯編語義
我們再來一點進階的使用,筆者的maven項目有下面這樣一段代碼,我們希望查看volatile底層匯編碼的實現:
private volatile static int num = 0;
public static void main(String[] args) throws InterruptedException {
num++;
}
對此我們首先打開jitwatch,然后點擊配置選擇上述代碼對應的代碼路徑和字節碼路徑:
然后找到我們的項目,添加如下JVM參數并運行項目:
-Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:+LogCompilation -XX:LogFile=jit.log
完成運行后,我們會在項目中看到一個名為jit.log的文件:
最后我們回到jitwatch打開這個日志:
最后點擊以下start,此時程序就會處理字節碼和匯編碼指令的解析和映射:
完成后,找到我們代碼的包路徑,點擊main方法:
最終我們就可以看到對應volatile自增代碼段對應的字節碼和匯編碼,如下便是num++的字節碼的復合操作:
0: getstatic #2 // Field num:I
3: iconst_1
4: iadd
5: putstatic #2 // Field num:I
8: return
對應的匯編如下:
- 將num放到寄存器
- 執行inc自增
- 通過lock前綴將cpu緩存中累加的num強制寫回內存中
0x00000000039605b6: mov 0x68(%rsi),%edi ;*getstatic num
; - com.sharkchili.Main::main@0 (line 11)
0x00000000039605b9: inc %edi
0x00000000039605bb: mov %edi,0x68(%rsi)
0x00000000039605be: lock addl $0x0,(%rsp) ;*putstatic num
; - com.sharkchili.Main::main@5 (line 11)
對應的觀測截圖如下,可以看到我們可以基于代碼段做到字節碼和匯編碼的對照: