總是使用命令行工具在現代化社會好像已經跟不上節奏了,尤爲是在作JIT分析時,使用LogCompilation輸出的日誌實在是太大了,讓人望而生畏。有沒有什麼更加簡便的方法來分析JIT日誌呢?快來和小師妹一塊兒來學習JITWatch吧。java
小師妹,F師兄,JIT就是Just In Time compilers。能不能再總結一下JIT究竟是作什麼的呢?git
固然沒問題,JIT主要有兩個做用,第一個做用你們應該已經知道了,就是在運行時將byte code編譯成爲機器碼,提升程序的執行速度。程序員
第二個做用就是在運行時對代碼進行優化,一樣的也對性能進行提高。github
JIT中有兩種編譯器,C1表明的是Client Compiler,C2表明的是Server Compiler。spring
其中C1只是簡單的編譯,而C2在收集到更多信息以後,會進行更加深刻的編譯和優化。編程
常見的優化手段有:Loop unrolling, Inlining, Dead Code Elimination,Escape analysis, Intrinsics, Branch prediction等。sass
JDK8中會默認啓動分層編譯。你也可使用-XX:+TieredCompilation來手動啓動它。微信
更多精彩內容且看:jvm
小師妹:F師兄,上次你講的LogCompilation和PrintCompilation輸出結果仍是太複雜了,尤爲是LogCompilation,輸出的結果有十幾M,分析起來好難。有沒有更簡單一點的辦法,讓個人工做效率加倍呢?spring-boot
這個必須有,有需求就有市場,有需求就有大神出場。今天給你介紹一個工具叫作JITWatch。
JITWatch是一個大神作的JIT日誌的可視化分析工具。在使用它以前你可能以爲它有點強大,在使用後你就會以爲它真的是強大。
小師妹:F師兄,這麼強大的工具,快快介紹我使用吧。
徹底沒有問題,不過JITWatch沒有現成的打包好的可執行文件。沒錯,你須要到github上面下載源碼。
下載完畢,能夠執行:
mvn clean compile test exec:java
複製代碼
就能夠開啓JITWatch之旅了。
小師妹:F師兄,這麼好用的工具爲何不打個包出來讓你們直接用呢?還要下載源碼這麼麻煩。
其實吧,JITWatch爲了你們方便使用,自帶一個Sandbox功能,提供了一些能夠直接在JITWatch中運行的代碼,同時JITWatch能夠實現源碼的實時比對功能。因此須要你們下載源碼。
閒話休提,咱們開啓JITWatch之旅吧。
入眼就是如此樸實無華的界面,讓人感受總有點...重劍無鋒,大巧不工。高手作的UI就是這麼的完美。
接下來咱們須要運行一個程序,來實時感覺一下JITWatch的魅力。
看到左邊最上角的sandbox了嗎?點開它能夠看到下面的sandbox頁面:
這一個頁面會選擇一個sadbox中的例子展現給你,你們注意下面的輸出框的說明,它會顯示你的Disassembler是否可用。若是想要安裝disassembler,請參照我以前的文章。
若是你對這個例子不滿意,或者你想使用本身的代碼,那也徹底沒有問題。點擊config。
這裏你能夠配置源代碼的路徑,能夠選擇VM的語言,還有各類VM的選項,下面的選項相信我在以前的文章中都已經介紹過了吧。
若是還有不懂的小夥伴,微信我,私聊我,1對1現場教學。
萬事俱備,只欠東風,開始吧,我但是要成爲Java王的男人!
而後咱們就進入了TirView界面,這裏咱們可看到主界面分紅了三部分,源代碼,ByteCode和Assembly。
小師妹:真是熱淚盈眶啊,終於不須要本身去添加那些XX參數了。面向界面編程,真好。
上面還有幾個按鈕,這裏簡單介紹一下他們的功能,具體的界面這裏就不截圖了,由於實在是太多了....
Chain會展現調用鏈。
Journal就是以前使用LogCompilation產生的xml日誌。
LNT,全稱是line number table。---目前我還不知道這個是作什麼用的,有知道的朋友,請給我留言。
而後就是Inlined into功能了,這個功能要詳細講一下,由於會影響到程序的執行效率。
還記得以前舉的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; //內聯替換
複製代碼
上面的add方法能夠簡單的被替換成爲內聯表達式。
JITWatch能夠顯示方法是否被inlined,而且顯示出inlined的緣由。
點擊BCI能夠顯示關聯的inlined的代碼。你們自行體會。
如今再讓咱們回到可愛又有風格的主頁面:
左邊是源代碼,包含了JDK本身的代碼,若是你想詳細的分析JDK本身代碼的優化,那麼這是一個很是好的工具。
右邊顯示的是被JIT編譯的類和方法,而且展現了編譯級別和編譯的時間。
右上角又有一排按鈕,Config是用來配置運行的代碼。
TimeLine是以圖形的形式展現JIT編譯的時間軸。
Histo是直方圖展現的一些編譯信息。
TopList裏面是編譯中產生的一些對象的或者數據的排序。
Cache是free code cache空間。
NMethod是native方法。
Threads是JIT編譯的線程。
TriView就是咱們最開始展現的面板。
最後咱們重點講一下Suggestion:
Suggestion是對代碼的一些優化建議。
從上圖咱們能夠看到在調用String的hashMap方法時候沒法inlined,由於被調用的方法太大了,超出了最大inlining size。
因此,咱們經過JITWatch能夠學到什麼呢?最最重要的是咱們能夠經過JITWatch來分析JIT的運行原理和本質。而後inlined的方法不要太大了,不然影響執行效率。
本文做者:flydean程序那些事
本文連接:www.flydean.com/jvm-jit-jit…
本文來源:flydean的博客
歡迎關注個人公衆號:程序那些事,更多精彩等着您!