當前位置:
首頁 > 知識 > 使用 JITWatch 查看 JVM 的 JIT 編譯代碼

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


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 ImportNew 的精彩文章:

TAG:ImportNew |