1. 程式人生 > >聊聊JVM(十)Mac下hsdis和jitwatch下載和使用

聊聊JVM(十)Mac下hsdis和jitwatch下載和使用

hsdis能夠檢視Java生成的彙編程式碼,具體的可以檢視上面這篇文章。這裡提供一下Mac下的hsdis-amd64.dylib和hsdis-amd64.so檔案的下載地址http://pan.baidu.com/s/1i3HxFDF

免得還要重新去編譯。前者是Mac 64位機器下的,後者是Linux 64位機器下的。

下載下來hsdis之後,最簡單讓java命令載入它的方法是把它放在一個目錄下面,然後export一下這個目錄就行,比如在.bashrc下面

export LD_LIBRARY_PATH=~/Documents/hsdis/

這樣就可以使用hsdis來檢視JIT生成的彙編程式碼了。可以用下面的命令來檢視hsdis是否工作
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -version

看到下面這個結果證明hsdis已經配置正確了

下面來試一下用hsdis來生成一個類的彙編碼。

java -server指令指定了JIT使用C2編譯器來優化,-Xcomp選項指定了JVM以編譯模式執行,否則預設是Mix模式,只有熱點程式碼才會被JIT編譯優化。很多人說寫的類沒有被JIT編譯,我的經驗是這個類如果有main方法就會生成彙編碼。-XX:+PrintAssembly 可以列印彙編碼。執行下面命令可以讓JIT編譯並把結果生成到指定的log檔案中

java -server -Xcomp  -XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading  -XX:+PrintAssembly -XX:+LogCompilation 
-XX:LogFile=jit.log test.TestMain

可以用jitwatch工具來檢視剛生成的日誌檔案。 jitwatch可以從http://pan.baidu.com/s/1i3HxFDF 下載。我放了一個jitwatch.sh在裡面,下載下來之後改一下檔案中的路徑就可以直接運行了。

用jitwatch可以看到哪些方法被JIT編譯了


在呼叫一個方法後,會設定OopMap狀態,這是一個safepoint


在方法返回前,會插入safepoint polling page的程式碼 test %eax, 0xxxxxxx,以便讓執行緒進入到這個safepoint的時候可以被阻塞


hsdis和jitwatch是學習JVM的利器,下載下來用一用吧