JVM編譯優(yōu)化-即時編譯器(JIT)

Java語言的“編譯期”几缭,可能指的是一個前端編譯期,把*.java文件轉(zhuǎn)變?yōu)?*.class文件的過程揣苏;也可能是虛擬機(jī)的后端運行期編譯器(JIT)把字節(jié)碼轉(zhuǎn)變?yōu)闄C(jī)器碼的過程幔摸,還可能是指使用靜態(tài)編譯器(AOT編譯器,Ahead Of Time Compiler)直接把 java文件編譯成本地機(jī)器碼的過程沥寥。

編譯期很廣碍舍,我們這里討論即時編譯器,因為即使編譯器邑雅,以下簡稱JIT片橡,JIT在運行期的優(yōu)化過程對于程序的運行更加重要。

JIT簡介

Java程序最初是通過解釋器來解釋執(zhí)行的淮野,當(dāng)虛擬器發(fā)現(xiàn)某個方法或代碼塊的運行特別頻繁時捧书,就會把這些代碼認(rèn)定為“熱點代碼”,為了提高熱點代碼的執(zhí)行效率骤星,在運行時经瓷,虛擬機(jī)會把這些代碼編譯為機(jī)器碼,并進(jìn)行各種層次的優(yōu)化洞难,完成這個任務(wù)的編譯器成為即使編譯器(JIT)舆吮。

簡單說就是熱點代碼會被進(jìn)行優(yōu)化。

image.png

什么是熱點代碼队贱?

  • 被多次調(diào)用的方法:方法調(diào)用的多了色冀,代碼執(zhí)行次數(shù)也多,成為熱點代碼很正常柱嫌。
  • 被多次執(zhí)行的循環(huán)體:假如一個方法被調(diào)用的次數(shù)少呐伞,只有一次或兩次,但方法內(nèi)有個循環(huán)慎式,一旦涉及到循環(huán)伶氢,部分代碼執(zhí)行的次數(shù)肯定多,這些多次執(zhí)行的循環(huán)體內(nèi)代碼也被認(rèn)為“熱點代碼”

如何檢測熱點代碼瘪吏?

判斷一段代碼是不是熱點代碼癣防,是不是需要觸發(fā)JIT,這樣的行為成為熱點探測掌眠,主要方式有兩種蕾盯。

  • 基于采樣的熱點探測:采樣,指把時間域或空間域的連續(xù)量轉(zhuǎn)化成離散量的過程蓝丙,也就是取一部分级遭,周期性的檢查線程的棧頂望拖,如果發(fā)現(xiàn)某些方法經(jīng)常出現(xiàn)在棧頂,即熱點方法挫鸽。

    缺點:不夠精確说敏,容易受到線程阻塞或外界因素的影響
    優(yōu)點:簡單,高效

  • 基于計數(shù)的熱點探測(HotSpot虛擬器默認(rèn)):為每個方法甚至是代碼塊建立計數(shù)器丢郊,統(tǒng)計執(zhí)行次數(shù)盔沫,如果執(zhí)行次數(shù)超過一定閾值就認(rèn)為是熱點代碼。

    缺點:實現(xiàn)麻煩
    優(yōu)點:統(tǒng)計結(jié)果精確

HotSpot虛擬器為每個方法準(zhǔn)備了兩類計數(shù)器:方法調(diào)用計數(shù)器和回邊計數(shù)器枫匾,兩個計數(shù)器都有一定的閾值架诞,超過閾值就會觸發(fā)JIT.

-XX:CompileThreshold 可以設(shè)置閾值大小,Client 編譯器模式下干茉,閾值 默認(rèn)的值 1500谴忧,而 Server 編譯器模式下,閾值 默認(rèn)的值則是 10000角虫。

編譯器優(yōu)化

當(dāng)JVM編譯代碼時俏蛮,它會將匯編指令保存在代碼緩存,代碼緩存具有固定大小上遥,一旦它被填滿搏屑,JVM將不能編譯更多的代碼。

–XX:ReservedCodeCacheSize 選項去增加代碼緩存的大小粉楚。

查看編譯日志

JVM啟動時辣恋,-XX:+PrintCompilation,它會報告什么時候代碼緩存滿了模软,以及什么時候編譯停止了伟骨。

另外可以通過jstat來查看編譯器信息。

jstat -compile JVM進(jìn)程ID
?  ~ jstat -compiler 56067
Compiled Failed Invalid   Time   FailedType FailedMethod
     968      0       0     0.80          0

最后

Java語言編譯優(yōu)化包含很多內(nèi)容燃异,這次主要圍繞JIT即時編譯器周邊來說携狭,希望能幫助到大家。

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末回俐,一起剝皮案震驚了整個濱河市逛腿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仅颇,老刑警劉巖单默,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異忘瓦,居然都是意外死亡搁廓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來境蜕,“玉大人蝙场,你說我怎么就攤上這事×荒辏” “怎么了售滤?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長逼泣。 經(jīng)常有香客問我,道長舟舒,這世上最難降的妖魔是什么拉庶? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任秃励,我火速辦了婚禮,結(jié)果婚禮上夺鲜,老公的妹妹穿的比我還像新娘皆尔。我一直安慰自己币励,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布食呻。 她就那樣靜靜地躺著,像睡著了一般仅胞。 火紅的嫁衣襯著肌膚如雪每辟。 梳的紋絲不亂的頭發(fā)上干旧,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機(jī)與錄音椎眯,去河邊找鬼挠将。 笑死,一個胖子當(dāng)著我的面吹牛编整,可吹牛的內(nèi)容都是我干的捐名。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼闹击,長吁一口氣:“原來是場噩夢啊……” “哼镶蹋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤贺归,失蹤者是張志新(化名)和其女友劉穎淆两,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拂酣,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡秋冰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了婶熬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剑勾。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赵颅,靈堂內(nèi)的尸體忽然破棺而出虽另,到底是詐尸還是另有隱情,我是刑警寧澤饺谬,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布捂刺,位于F島的核電站,受9級特大地震影響募寨,放射性物質(zhì)發(fā)生泄漏族展。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一拔鹰、第九天 我趴在偏房一處隱蔽的房頂上張望仪缸。 院中可真熱鬧,春花似錦列肢、人聲如沸腹殿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锣尉。三九已至,卻和暖如春决采,著一層夾襖步出監(jiān)牢的瞬間自沧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工树瞭, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留拇厢,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓晒喷,卻偏偏與公主長得像孝偎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子凉敲,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容