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

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

2018-07-02    來(lái)源:importnew

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

背景

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

查看Java源代碼對(duì)應(yīng)的bytecode可以通過(guò)javap來(lái)實(shí)現(xiàn)。

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

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

使用

安裝和啟動(dòng)JitWatch

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

jitwatch

給JDK添加Hsdis

參考我的Github上的說(shuō)明hsdis
通過(guò)以下命令檢測(cè)下是否安裝成功

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

啟動(dòng)一個(gè)應(yīng)用,并且配置輸出日志

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

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

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

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

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

jitwatch-volatilewrite.jpg

標(biāo)簽: ssl 代碼

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

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

下一篇:細(xì)說(shuō) Java 中的字符和字符串( 一 )