JIT的Profile神器JITWatch

簡介

總是使用命令行工具在現代化社會好像已經跟不上節奏了,尤爲是在作JIT分析時,使用LogCompilation輸出的日誌實在是太大了,讓人望而生畏。有沒有什麼更加簡便的方法來分析JIT日誌呢?快來和小師妹一塊兒來學習JITWatch吧。java

什麼是JIT

小師妹,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

JITWatch簡介

小師妹:F師兄,上次你講的LogCompilation和PrintCompilation輸出結果仍是太複雜了,尤爲是LogCompilation,輸出的結果有十幾M,分析起來好難。有沒有更簡單一點的辦法,讓個人工做效率加倍呢?spring-boot

這個必須有,有需求就有市場,有需求就有大神出場。今天給你介紹一個工具叫作JITWatch。

JITWatch是一個大神作的JIT日誌的可視化分析工具。在使用它以前你可能以爲它有點強大,在使用後你就會以爲它真的是強大。

運行JITWatch

小師妹:F師兄,這麼強大的工具,快快介紹我使用吧。

徹底沒有問題,不過JITWatch沒有現成的打包好的可執行文件。沒錯,你須要到github上面下載源碼。

下載完畢,能夠執行:

mvn clean compile test exec:java

就能夠開啓JITWatch之旅了。

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程序那些事

本文連接:http://www.flydean.com/jvm-jit-jitwatch/

本文來源:flydean的博客

歡迎關注個人公衆號:程序那些事,更多精彩等着您!

相關文章
相關標籤/搜索