歡迎光臨
每天分享高質量文章

使用 JITWatch 查看 JVM 的 JIT 編譯代碼

(點擊上方公眾號,可快速關註)


來源:劉正陽 ,

liuzhengyang.github.io/2017/07/27/jitwatch/

背景

我們知道Java代碼通過編譯器編譯成位元組碼,一般是class檔案,有JVM的各個類加載器加載後,根據JVM的啟動配置可以進行解釋執行和編譯執行,編譯執行是由JIT(Just In Time)Compiler將位元組碼編譯成本地代碼來提高執行速度,缺點是編譯本身會消耗時間並且會占用堆外空間(codecache中), 但是一般Server應用記憶體足夠且能夠忍受啟動時的略微緩慢。

查看Java原始碼對應的bytecode可以通過javap來實現。

有時候我們想排查問題或者瞭解底層是如何實現的,就需要查看JIT編譯後的彙編代碼是什麼樣的,Hotspot提供了-XX:+PrintAssembly選項來輸出編譯後的彙編代碼,缺點是輸出日誌量巨大,並且難以和代碼中的對應起來。

JITWatch是一個查看JIT行為的可視化工具。

使用

安裝和啟動JitWatch

git clone https://github.com/AdoptOpenJDK/jitwatch

cd jitwatch

./gradlew run

給JDK添加Hsdis

參考我的Github上的說明hsdis

https://github.com/liuzhengyang/hsdis

通過以下命令檢測下是否安裝成功

java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -version

啟動一個應用,並且配置輸出日誌

在應用中添加如下JVM引數

-XX:+UnlockDiagnosticVMOptions

-XX:+TraceClassLoading

-XX:+LogCompilation

-XX:LogFile=/tmp/mylogfile.log

-XX:+PrintAssembly

-XX:+TraceClassLoading

然後在/tmp/mylogfile.log中就可以看到輸出的日誌了,在JITWatch界面中選擇OpenLog選擇日誌,然後點擊Open

然後選擇想要查看的類和對應的方法,即可查看對應的原始碼、ByteCode、JIT生成的AssemblyCode。

這裡可以看到一個經常提到的volatile欄位的實現,在MacOS x64的實現是在volatile write後添加一個lock指令作為StoreLoad屏障來保證可見性和防止重排序的。更多JMM的內容可以參考我的另一篇文章Java記憶體模型JMM淺析

https://liuzhengyang.github.io/2017/05/12/javamemorymodel/

【關於投稿】


如果大家有原創好文投稿,請直接給公號發送留言。


① 留言格式:
【投稿】+《 文章標題》+ 文章鏈接

② 示例:
【投稿】《不要自稱是程式員,我十多年的 IT 職場總結》:http://blog.jobbole.com/94148/

③ 最後請附上您的個人簡介哈~



看完本文有收穫?請轉發分享給更多人

關註「ImportNew」,提升Java技能

赞(0)

分享創造快樂