前言
在研究JVM時,想要研究下volatile
關鍵字的底層實現,需要其對其彙編代碼的指令進行觀察,故需要查看即時編譯器產生的彙編代碼。
正文
環境:linux(deepin)
hsdis的配置
- 進入https://sourceforge.net/projects/fcml/files/fcml-1.1.3/,下載源碼並解壓(這裏可能需要科學上網)
- cd fcml-1.1.3
- ./configure && make && sudo make install
- cd example/hsdis && make && sudo make install
- source /etc/profile
- sudo ln -s /usr/local/lib/libhsdis.so <JAVA_HOME>/lib/amd64/hsdis-amd64.so
- sudo ln -s /usr/local/lib/libhsdis.so <JAVA_HOME>/jre/lib/amd64/hsdis-amd64.so
此時隨便編寫一個java文件Test.java。
- javac Test.java
- java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly Test
成功打印彙編代碼信息。
jitwatch工具的使用
以上打印的彙編代碼過於雜亂,可以通過jitwatch
工具來提供便利。
- git clone https://github.com/AdoptOpenJDK/jitwatch
- cd jitwatch
- mvn clean
- mvn install
- ./launchUI.sh
此時便可以打開jitwatch
工具。
具體查看某個類的彙編代碼的步驟如下:
首先,使用 Hsdis
執行代碼,輸出反彙編內容:
javac Test.java
java -server -XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading -XX:+PrintAssembly -XX:+LogCompilation -XX:LogFile=test.log Test # Test是java文件類名, test.log 是輸出的 log 文件,輸出到當前目錄下
接着,通過jitwatch
工具open log
打開日誌文件,即可以看到各個方法的彙編代碼,關於此工具的更多使用說明可自行搜索。
總結
再次看周志明的《深入理解Java虛擬機》,感覺好接受很多了,JVM還得沉下心來慢慢學。