使用hsdis與jitwatch查看JIT后的匯編碼

一映九、摘要

?之前在《Java class文件結(jié)構(gòu)(實(shí)例篇)》這一篇文章中講解了我們通過javap命令查看編譯成class的字節(jié)碼文件,字節(jié)碼是JVM執(zhí)行需要使用到的文件暖呕,但是cpu執(zhí)行的應(yīng)該是匯編指令呈枉;那么,我們應(yīng)該如何來看JIT之后的匯編碼呢剩蟀?如果我們能夠通過工具來閱讀匯編指令,這個(gè)將有利于我們從操作系統(tǒng)或者更底層的角度來分析我們的Java程序切威。本文將從hsdis和jitwatch兩個(gè)工具的角度來分析育特,怎么樣閱讀JIT之后的匯編碼。


二先朦、使用hsdis生成程序執(zhí)行生成的jit匯編碼日志

?這里將不講述hsdis怎么安裝缰冤,大家自行g(shù)oogle或者百度下犬缨;我是直接將hsdis-amd64.dll文件放到我的jdk1.8.0_144\jre\bin\server路徑下,如圖:

?接下來給一個(gè)小段的程序?yàn)槔嫘常瑏砩稍摮绦虻腏IT之后的匯編碼日志文件:

/**
 * <Description> JVM參數(shù): -server -XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading  -XX:+PrintAssembly -XX:+LogCompilation -XX:LogFile=live.log<br>
 *
 * @author Sunny<br>
 * @version 1.0<br>
 * @taskId: <br>
 * @createDate 2019/01/21 15:37 <br>
 * @see com.sunny.concurrent.hsdis <br>
 */
public class SimpleInliningTest {
    private int count = 0;

    public static void main(String[] args) throws Exception {
        SimpleInliningTest t = new SimpleInliningTest();
        int sum = 0;
        for (int i = 0; i < 1000000; i++) {
            sum += t.m();
        }
        System.out.println(sum);
    }

    public int m() {
        int i = count;
        i = m2(i);
        i += count;
        i *= count;
        i++;
        return i;
    }

    public int m2(int i) {
        if (i % 10 == 0) {
            i += 1;
        } else if (i % 10 == 1) {
            i += 2;
        } else if (i % 10 == 2) {
            i += 3;
        }
        return i;
    }
}

?配置執(zhí)行時(shí)JVM參數(shù)遍尺,也即打印匯編碼的日志文件

-server -XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading  -XX:+PrintAssembly -XX:+LogCompilation -XX:LogFile=live.log

?執(zhí)行SimpleInliningTest這個(gè)類之后,變會(huì)在工程的根目錄生成live.log文件涮拗,同時(shí)控制臺(tái)也會(huì)打印匯編碼指令:



三乾戏、使用jitwatch查看hsdis生成的匯編碼日志

?從https://github.com/AdoptOpenJDK/jitwatch下載完整的jitwatch源碼包,然后使用maven命令進(jìn)行編譯三热,由于編譯test文件會(huì)報(bào)錯(cuò)鼓择,所以maven編譯的時(shí)候忽略test包的編譯,使用如下命令:

mvn clean install -Dmaven.test.skip=true

?編譯成功之后就漾,直接使用launchUI.bat命令打開jitwatch工具:


?Open log打開第二章中生成的live.log呐能,并通過config來配置代碼的源碼路徑和class的路徑:



?點(diǎn)擊start開始執(zhí)行:



?執(zhí)行完成之后,單擊右邊的方法或者點(diǎn)擊TriView:


?我們能看到TriView視圖:左邊為Java源代碼抑堡,中間為字節(jié)碼摆出,右邊為生成的匯編碼;



?當(dāng)再單擊Inlined Into按鈕后首妖,我們將看到內(nèi)聯(lián)的所有方法:


?當(dāng)單擊Chain之后偎漫,我們將看到已編譯和內(nèi)聯(lián)子項(xiàng)鏈:

?jitwatch工具也同樣給我們查看一些熱或者不熱的,而且不能內(nèi)聯(lián)的一些大型方法的建議:


?我們還可以按字節(jié)代碼大小和native代碼大小查看最大的方法:




?我們也能看到有多少個(gè)方法被編譯了有缆,有多少被C1編譯了象踊,有多少被C2編譯了:


?這是編譯的方法的時(shí)間線圖。我們可以點(diǎn)擊與每種方法相對(duì)應(yīng)的彩色線條棚壁。

?最后是最重要的標(biāo)簽杯矩。在這里,您可以查看代碼消耗了多少緩存袖外。您可以根據(jù)此用法更改代碼緩存內(nèi)存大小史隆。

?我們也可以直接將代碼貼到j(luò)itwatch里面的sandbox中進(jìn)行執(zhí)行操作:



四、通過Idea查看class對(duì)應(yīng)的匯編碼
?在把hsdis-amd64.dll放到JDK的server下面之后在刺,在idea運(yùn)行類上面配置如下信息逆害,執(zhí)行class文件即可打印匯編指令

 -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly

參考:

https://github.com/AdoptOpenJDK/jitwatch/wiki
http://marjavamitjava.com/jitwatch-use-analyze-jit-compilation/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蚣驼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌相艇,老刑警劉巖颖杏,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異坛芽,居然都是意外死亡留储,警方通過查閱死者的電腦和手機(jī)翼抠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來获讳,“玉大人阴颖,你說我怎么就攤上這事∝はィ” “怎么了量愧?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)帅矗。 經(jīng)常有香客問我偎肃,道長(zhǎng),這世上最難降的妖魔是什么浑此? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任累颂,我火速辦了婚禮,結(jié)果婚禮上凛俱,老公的妹妹穿的比我還像新娘紊馏。我一直安慰自己,他們只是感情好蒲犬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布朱监。 她就那樣靜靜地躺著,像睡著了一般暖哨。 火紅的嫁衣襯著肌膚如雪赌朋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天篇裁,我揣著相機(jī)與錄音沛慢,去河邊找鬼。 笑死达布,一個(gè)胖子當(dāng)著我的面吹牛团甲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播黍聂,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼躺苦,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了产还?” 一聲冷哼從身側(cè)響起匹厘,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脐区,沒想到半個(gè)月后愈诚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年炕柔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酌泰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匕累,死狀恐怖陵刹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情欢嘿,我是刑警寧澤衰琐,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站际插,受9級(jí)特大地震影響碘耳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜框弛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一辛辨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瑟枫,春花似錦斗搞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至膝擂,卻和暖如春虑啤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背架馋。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工狞山, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叉寂。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓萍启,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親屏鳍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子勘纯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355