Java JIT Just In Time 即時編譯

更多 Java 虛擬機方面的文章戏罢,請參見文集《Java 虛擬機》


前端編譯器 VS 后端編譯器

  • 前端編譯器:javac 編譯屋谭,在程序運行前,將 源文件 轉(zhuǎn)化為 字節(jié)碼 即 .class 文件
    • Java 程序最初只能通過解釋器解釋執(zhí)行龟糕,即 JVM 對字節(jié)碼逐條解釋執(zhí)行桐磁,因此執(zhí)行速度比較慢。
    • 字節(jié)碼與平臺無關(guān)
  • 后端編譯器:JIT 編譯讲岁,在程序運行期間我擂,將 字節(jié)碼 轉(zhuǎn)化為 機器碼
    • 機器碼與平臺相關(guān)

JIT 即時編譯

當 JVM 發(fā)現(xiàn)某個方法或代碼塊執(zhí)行特別頻繁時,就將其認定為 熱點代碼(Hot Spot Code)缓艳。在程序運行期間校摩,JVM 將這些熱點代碼編譯為與本地平臺相關(guān)的機器碼,并進行各層次的優(yōu)化阶淘,從而提升熱點代碼的執(zhí)行效率秧耗。

基本流程如下:


JIT 即時編譯

如何檢測熱點代碼(Hot Spot Code):

  • 基于 采樣 的熱點檢測:檢查各個線程的棧頂。
  • 基于 計數(shù)器 的熱點檢測:HotSpot 虛擬機采用:
    • 方法計數(shù)器:統(tǒng)計每個方法調(diào)用的次數(shù)
    • 回邊計數(shù)器:統(tǒng)計每個方法中循環(huán)體代碼執(zhí)行的次數(shù)

即時編譯的設(shè)置及優(yōu)化

初級調(diào)優(yōu)

HotSpot 虛擬機內(nèi)置兩個 JIT 編譯器:

  • 客戶模式 Client Compiler舶治,即 C1 編譯
    • 無采樣分井,立即 JIT 編譯,輕量優(yōu)化
    • JIT 編譯的類較多霉猛,可能導致代碼緩存不夠用
    • 速度較快尺锚,適用于短暫的應用程序
  • 服務(wù)器模式 Server Compiler,即 C2 編譯
    • 采集 一萬次 調(diào)用樣本后深度編譯優(yōu)化
    • JIT 編譯的類較少
    • 啟動速度較慢惜浅,運行起來后性能逐步提升
    • 每次 GC瘫辩,計數(shù)器衰減一半
    • 可以設(shè)置 -XX:-UseCounterDelay 來禁止衰減

Java 8 支持多層編譯,即程序啟動時使用 C1 編譯坛悉,樣本足夠后使用 C2 編譯:

  • 禁止多層編譯:-XX:-TieredCompilation
  • 啟用多層編譯:-XX:+TieredCompilation

優(yōu)化代碼緩存

如果緩存過小伐厌,有些熱點代碼可能不會被 JIT 編譯。
C1 編譯的類較多裸影,可能導致代碼緩存不夠用挣轨。
設(shè)置代碼緩存大小:-XX:ReservedCodeCacheSize = 32m

編譯閾值

即計數(shù)器的閾值轩猩,默認為10000卷扮,即方法計數(shù)器和回邊計數(shù)器的總和達到了10000就觸發(fā) JIT 編譯。
設(shè)置編譯閾值:-XX:CompileThreshold = 10000

內(nèi)聯(lián) Inline

將方法的代碼復制到發(fā)起調(diào)用的方法里均践,以消除方法調(diào)用晤锹。
因為調(diào)用一個小方法可能比直接執(zhí)行該小方法對應的代碼更耗時。

  • -XX:MaxInlineSize=35byte:能被內(nèi)聯(lián)的方法最大字節(jié)碼大小
  • -XX:FreqInlineSize=325byte:頻繁調(diào)用的方法能被內(nèi)聯(lián)的最大字節(jié)碼大小

如何讓方法更容易被內(nèi)聯(lián):拆分不常訪問的路徑彤委。例如:

public void f() {
  if(most case) {
    ...
  }
  else {
    ... // 將不常訪問的路徑的代碼拆分到函數(shù) g() 中
    ... // 以降低整體代碼的大小鞭铆,使得 most case 中的代碼可以被內(nèi)聯(lián)
  }
}

打印 JIT 編譯信息

java -XX:PrintCompilation -XX:+UnlockDiagnosticVMOptions -XX:PrintInline > a.out

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市焦影,隨后出現(xiàn)的幾起案子车遂,更是在濱河造成了極大的恐慌,老刑警劉巖偷办,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艰额,死亡現(xiàn)場離奇詭異,居然都是意外死亡椒涯,警方通過查閱死者的電腦和手機柄沮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來废岂,“玉大人祖搓,你說我怎么就攤上這事『” “怎么了拯欧?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長财骨。 經(jīng)常有香客問我镐作,道長藏姐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任该贾,我火速辦了婚禮羔杨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杨蛋。我一直安慰自己兜材,他們只是感情好,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布逞力。 她就那樣靜靜地躺著曙寡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寇荧。 梳的紋絲不亂的頭發(fā)上举庶,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音砚亭,去河邊找鬼灯变。 笑死,一個胖子當著我的面吹牛捅膘,可吹牛的內(nèi)容都是我干的添祸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼寻仗,長吁一口氣:“原來是場噩夢啊……” “哼刃泌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起署尤,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤耙替,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后曹体,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俗扇,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年箕别,在試婚紗的時候發(fā)現(xiàn)自己被綠了铜幽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡串稀,死狀恐怖除抛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情母截,我是刑警寧澤到忽,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站清寇,受9級特大地震影響喘漏,放射性物質(zhì)發(fā)生泄漏护蝶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一陷遮、第九天 我趴在偏房一處隱蔽的房頂上張望滓走。 院中可真熱鬧,春花似錦帽馋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至衩藤,卻和暖如春吧慢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赏表。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工检诗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瓢剿。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓逢慌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親间狂。 傳聞我的和親對象是個殘疾皇子攻泼,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

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

  • 《深入理解Java虛擬機》筆記_第一遍 先取看完這本書(JVM)后必須掌握的部分。 第一部分 走近 Java 從傳...
    xiaogmail閱讀 5,093評論 1 34
  • 這篇文章是我之前翻閱了不少的書籍以及從網(wǎng)絡(luò)上收集的一些資料的整理鉴象,因此不免有一些不準確的地方忙菠,同時不同JDK版本的...
    高廣超閱讀 15,604評論 3 83
  • java編譯器,java解釋器 1.java程序是一種可跨平臺執(zhí)行的語言纺弊,之所以可以跨平臺牛欢,是因為jvm的存在,J...
    rabbit_coding閱讀 6,998評論 2 18
  • 注:此文是我在讀完周志明老師的深入理解Java虛擬機之后總結(jié)的一篇文章淆游,請閱讀此書獲取更加詳細的信息. 在這篇文章...
    AlstonWilliams閱讀 995評論 0 1
  • 對我來說基本上每次買衣服都是一場內(nèi)心的戰(zhàn)役稽犁,總是糾結(jié)買哪個焰望,總是覺得沒有自己喜歡的买决。其實細細想來齐苛,不是...
    loverewards閱讀 187評論 0 0