中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

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

2018-07-02    來源:importnew

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

背景

我們知道Java代碼通過編譯器編譯成字節(jié)碼,一般是class文件,有JVM的各個類加載器加載后,根據(jù)JVM的啟動配置可以進行解釋執(zhí)行和編譯執(zhí)行,編譯執(zhí)行是由JIT(Just In Time)Compiler將字節(jié)碼編譯成本地代碼來提高執(zhí)行速度,缺點是編譯本身會消耗時間并且會占用堆外空間(codecache中), 但是一般Server應用內(nèi)存足夠且能夠忍受啟動時的略微緩慢。

查看Java源代碼對應的bytecode可以通過javap來實現(xiàn)。

有時候我們想排查問題或者了解底層是如何實現(xiàn)的,就需要查看JIT編譯后的匯編代碼是什么樣的,Hotspot提供了-XX:+PrintAssembly選項來輸出編譯后的匯編代碼,缺點是輸出日志量巨大,并且難以和代碼中的對應起來。

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

使用

安裝和啟動JitWatch

git clone https://github.com/AdoptOpenJDK/jitwatch
cd jitwatch
./gradlew run

jitwatch

給JDK添加Hsdis

參考我的Github上的說明hsdis
通過以下命令檢測下是否安裝成功

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

啟動一個應用,并且配置輸出日志

在應用中添加如下JVM參數(shù)

-XX:+UnlockDiagnosticVMOptions
-XX:+TraceClassLoading
-XX:+LogCompilation
-XX:LogFile=/tmp/mylogfile.log
-XX:+PrintAssembly
-XX:+TraceClassLoading

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

jitwatch-openlog.jpg
然后選擇想要查看的類和對應的方法,即可查看對應的源代碼、ByteCode、JIT生成的AssemblyCode。
jitwatch-assembly.jpg

這里可以看到一個經(jīng)常提到的volatile字段的實現(xiàn),在MacOS x64的實現(xiàn)是在volatile write后添加一個lock指令作為StoreLoad屏障來保證可見性和防止重排序的。更多JMM的內(nèi)容可以參考我的另一篇文章Java內(nèi)存模型JMM淺析。

jitwatch-volatilewrite.jpg

標簽: ssl 代碼

版權(quán)申明:本站文章部分自網(wǎng)絡,如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:細說 Java 中的字符和字符串( 二 )

下一篇:細說 Java 中的字符和字符串( 一 )