使用 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技能
TAG:ImportNew |