JIT的Profile神器JITWatch
簡(jiǎn)介
老是使用命令行工具在現(xiàn)代化社會(huì)好像已經(jīng)跟不上節(jié)奏了,尤其是在做JIT分析時(shí),使用LogCompilation輸出的日志實(shí)在是太大了,讓人望而生畏。有沒有什么更加簡(jiǎn)便的方法來(lái)分析JIT日志呢?快來(lái)和小師妹一起來(lái)學(xué)習(xí)JITWatch吧。
什么是JIT
小師妹,F師兄,JIT就是Just In Time compilers。能不能再總結(jié)一下JIT到底是做什么的呢?
當(dāng)然沒問(wèn)題,JIT主要有兩個(gè)作用,第一個(gè)作用大家應(yīng)該已經(jīng)知道了,就是在運(yùn)行時(shí)將byte code編譯成為機(jī)器碼,提高程序的執(zhí)行速度。
第二個(gè)作用就是在運(yùn)行時(shí)對(duì)代碼進(jìn)行優(yōu)化,同樣的也對(duì)性能進(jìn)行提升。
JIT中有兩種編譯器,C1代表的是Client Compiler,C2代表的是Server Compiler。
其中C1只是簡(jiǎn)單的編譯,而C2在收集到更多信息之后,會(huì)進(jìn)行更加深入的編譯和優(yōu)化。
常見的優(yōu)化手段有:Loop unrolling, Inlining, Dead Code Elimination,Escape analysis, Intrinsics, Branch prediction等。
JDK8中會(huì)默認(rèn)啟動(dòng)分層編譯。你也可以使用-XX:+TieredCompilation來(lái)手動(dòng)啟動(dòng)它。
更多精彩內(nèi)容且看:
- 區(qū)塊鏈從入門到放棄系列教程-涵蓋密碼學(xué),超級(jí)賬本,以太坊,Libra,比特幣等持續(xù)更新
- Spring Boot 2.X系列教程:七天從無(wú)到有掌握Spring Boot-持續(xù)更新
- Spring 5.X系列教程:滿足你對(duì)Spring5的一切想象-持續(xù)更新
- java程序員從小工到專家成神之路(2020版)-持續(xù)更新中,附詳細(xì)文章教程
JITWatch簡(jiǎn)介
小師妹:F師兄,上次你講的LogCompilation和PrintCompilation輸出結(jié)果還是太復(fù)雜了,尤其是LogCompilation,輸出的結(jié)果有十幾M,分析起來(lái)好難。有沒有更簡(jiǎn)單一點(diǎn)的辦法,讓我的工作效率加倍呢?
這個(gè)必須有,有需求就有市場(chǎng),有需求就有大神出場(chǎng)。今天給你介紹一個(gè)工具叫做JITWatch。
JITWatch是一個(gè)大神做的JIT日志的可視化分析工具。在使用它之前你可能覺得它有點(diǎn)強(qiáng)大,在使用后你就會(huì)覺得它真的是強(qiáng)大。
運(yùn)行JITWatch
小師妹:F師兄,這么強(qiáng)大的工具,快快介紹我使用吧。
完全沒有問(wèn)題,不過(guò)JITWatch沒有現(xiàn)成的打包好的可執(zhí)行文件。沒錯(cuò),你需要到github上面下載源碼。
下載完畢,可以執(zhí)行:
mvn clean compile test exec:java就可以開啟JITWatch之旅了。
JITWatch詳解
小師妹:F師兄,這么好用的工具為什么不打個(gè)包出來(lái)讓大家直接用呢?還要下載源碼這么麻煩。
其實(shí)吧,JITWatch為了大家方便使用,自帶一個(gè)Sandbox功能,提供了一些可以直接在JITWatch中運(yùn)行的代碼,同時(shí)JITWatch可以實(shí)現(xiàn)源碼的實(shí)時(shí)比對(duì)功能。所以需要大家下載源碼。
閑話休提,我們開啟JITWatch之旅吧。
入眼就是如此樸實(shí)無(wú)華的界面,讓人感覺總有點(diǎn)…重劍無(wú)鋒,大巧不工。高手做的UI就是這么的完美。
接下來(lái)我們需要運(yùn)行一個(gè)程序,來(lái)實(shí)時(shí)感受一下JITWatch的魅力。
看到左邊最上角的sandbox了嗎?點(diǎn)開它可以看到下面的sandbox頁(yè)面:
這一個(gè)頁(yè)面會(huì)選擇一個(gè)sadbox中的例子展示給你,大家注意下面的輸出框的說(shuō)明,它會(huì)顯示你的Disassembler是否可用。如果想要安裝disassembler,請(qǐng)參照我之前的文章。
如果你對(duì)這個(gè)例子不滿意,或者你想使用自己的代碼,那也完全沒有問(wèn)題。點(diǎn)擊config。
這里你可以配置源代碼的路徑,可以選擇VM的語(yǔ)言,還有各種VM的選項(xiàng),下面的選項(xiàng)相信我在之前的文章中都已經(jīng)介紹過(guò)了吧。
如果還有不懂的小伙伴,微信我,私聊我,1對(duì)1現(xiàn)場(chǎng)教學(xué)。
萬(wàn)事俱備,只欠東風(fēng),開始吧,我可是要成為Java王的男人!
然后我們就進(jìn)入了TirView界面,這里我們可看到主界面分成了三部分,源代碼,ByteCode和Assembly。
小師妹:真是熱淚盈眶啊,終于不需要自己去添加那些XX參數(shù)了。面向界面編程,真好。
上面還有幾個(gè)按鈕,這里簡(jiǎn)單介紹一下他們的功能,具體的界面這里就不截圖了,因?yàn)閷?shí)在是太多了…
Chain會(huì)展示調(diào)用鏈。
Journal就是之前使用LogCompilation產(chǎn)生的xml日志。
LNT,全稱是line number table。—目前我還不知道這個(gè)是做什么用的,有知道的朋友,請(qǐng)給我留言。
然后就是Inlined into功能了,這個(gè)功能要詳細(xì)講一下,因?yàn)闀?huì)影響到程序的執(zhí)行效率。
還記得之前舉的inline的例子嗎?
int a = 1; int b = 2; int result = add(a, b); ... public int add(int x, int y) { return x + y; } int result = a + b; //內(nèi)聯(lián)替換上面的add方法可以簡(jiǎn)單的被替換成為內(nèi)聯(lián)表達(dá)式。
JITWatch可以顯示方法是否被inlined,并且顯示出inlined的原因。
點(diǎn)擊BCI可以顯示關(guān)聯(lián)的inlined的代碼。大家自行體會(huì)。
現(xiàn)在再讓我們回到可愛又有風(fēng)格的主頁(yè)面:
左邊是源代碼,包含了JDK自己的代碼,如果你想詳細(xì)的分析JDK自己代碼的優(yōu)化,那么這是一個(gè)非常好的工具。
右邊顯示的是被JIT編譯的類和方法,并且展示了編譯級(jí)別和編譯的時(shí)間。
右上角又有一排按鈕,Config是用來(lái)配置運(yùn)行的代碼。
TimeLine是以圖形的形式展示JIT編譯的時(shí)間軸。
Histo是直方圖展示的一些編譯信息。
TopList里面是編譯中產(chǎn)生的一些對(duì)象的或者數(shù)據(jù)的排序。
Cache是free code cache空間。
NMethod是native方法。
Threads是JIT編譯的線程。
TriView就是我們最開始展示的面板。
最后我們重點(diǎn)講一下Suggestion:
Suggestion是對(duì)代碼的一些優(yōu)化建議。
從上圖我們可以看到在調(diào)用String的hashMap方法時(shí)候無(wú)法inlined,因?yàn)楸徽{(diào)用的方法太大了,超出了最大inlining size。
總結(jié)
所以,我們通過(guò)JITWatch可以學(xué)到什么呢?最最重要的是我們可以通過(guò)JITWatch來(lái)分析JIT的運(yùn)行原理和本質(zhì)。然后inlined的方法不要太大了,否則影響執(zhí)行效率。
本文作者:flydean程序那些事
本文鏈接:http://www.flydean.com/jvm-jit-jitwatch/
本文來(lái)源:flydean的博客
歡迎關(guān)注我的公眾號(hào):程序那些事,更多精彩等著您!
總結(jié)
以上是生活随笔為你收集整理的JIT的Profile神器JITWatch的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 深入理解编译优化之循环展开和粗化锁
- 下一篇: 小师妹学JVM之:cache line对