1. 安裝hsids
這一步比較麻煩,需要提前安裝cygwin,以及下載openjdk的源碼
具體步驟請參考下面的兩篇文章
How to build hsdis-amd64.dll and hsdis-i386.dll on Windows
編譯時還遇到兩個小坑
a. 使用最新的binutils-2.29無法編譯成功,最后只能下載binutils-2.27的包重新編譯
b. make的時候使用-j4參數希望加速編譯,結果反而編譯失敗,只能去掉-j4參數繼續單線程編譯,比較慢
編譯完成后,將/hsdis/build/Linux-amd64里生成的hsdis-amd64.dll文件復制到$JAVA_HOME/jre/bin/server里即可
2. 用hsdis查看JIT后的匯編碼
參考這篇文章
3. 用jitwatch更方便的查看JIT后的匯編碼
如果我們使用加-XX:+PrintAssembly參數的方法直接查看JIT后的匯編代碼,會得到很多很多的結果,非常難以看懂。
還好有個叫做jitwatch的工具可以幫助我們分析。
安裝方法:
a. 去jitwatch的github主頁上下載源碼,download zip就行了
b. 確定電腦上已經安裝了maven3組件,然后在解壓后的jitwatch源碼目錄里執行mvn clean compile exec:java
c. jitwatch的圖形界面啟動,如下圖所示
使用方法:
a. 使用-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:+LogCompilation -XX:LogFile=jit.log 參數啟動你的應用程序,然后工作目錄下就會產生一個名為jit.log的文件了,里面內容很多,試圖人肉分析基本是徒勞的。
b. 運行jitwatch,點擊"Open Log"按鈕,加載jit.log文件
c. 點擊"Config"按鈕,設置應用的源碼路徑和編譯后的Class路徑,如下圖所示:
d. 點擊"Start"按鈕,然后在左邊的樹形圖里選擇自己想要分析的Class,然后右邊點擊method,就會彈出匯編碼分析界面了,如下圖所示:
e. 分析界面分為左中右三欄,左邊為java源碼,中間為java字節碼,右邊為jit后的匯編碼,如果進行過多次jit編譯,還能分別查看編譯結果,如下圖所示:
總之,hsdis+jitwatch用起來還是比較方便的(雖然安裝起來確實比較費勁),推薦使用