21 - JVM逃逸分析

逃逸分析

逃逸分析是“一種確定指針動(dòng)態(tài)范圍的靜態(tài)分析缚陷,它可以分析在程序的哪些地方可以訪問到指針”

  • 在 Java 虛擬機(jī)的即時(shí)編譯語境下,逃逸分析將判斷新建的對(duì)象是否逃逸贤重,即時(shí)編譯器判斷對(duì)象是否逃逸的依據(jù)有:
    1. 對(duì)象是否被存入堆中(靜態(tài)字段或者堆中對(duì)象的實(shí)例字段)
      • 一旦對(duì)象被存入堆中础废,其他線程便能獲得該對(duì)象的引用。即時(shí)編譯器也因此無法追蹤所有使用該對(duì)象的代碼位置
    2. 對(duì)象是否被傳入未知代碼中
    • Java 虛擬機(jī)的即時(shí)編譯器是以方法為單位的崖飘,對(duì)于方法中未被內(nèi)聯(lián)的方法調(diào)用,即時(shí)編譯器會(huì)將其當(dāng)成未知代碼
    • 即時(shí)編譯器里的逃逸分析是放在方法內(nèi)聯(lián)之后的杈女,以便消除這些“未知代碼”入口

基于逃逸分析的優(yōu)化

  • 鎖消除
    • 如果即時(shí)編譯器能夠證明鎖對(duì)象不逃逸朱浴,那么對(duì)該鎖對(duì)象的加鎖、解鎖操作沒有意義
    • 即時(shí)編譯器可以消除對(duì)該不逃逸鎖對(duì)象的加鎖达椰、解鎖操作
    • synchronized (new Object()) {}會(huì)被完全優(yōu)化掉翰蠢,因?yàn)榛谔右莘治龅逆i消除
    • synchronized (escapedObject) {}則不然,由于其他線程可能會(huì)對(duì)逃逸了的對(duì)象escapedObject進(jìn)行加鎖操作啰劲,從而構(gòu)造了兩個(gè)線程之間的 happens-before 關(guān)系梁沧。因此即時(shí)編譯器至少需要為這段代碼生成一條刷新緩存的內(nèi)存屏障指令
  • 逃逸分析的結(jié)果更多被用于將新建對(duì)象操作轉(zhuǎn)換成棧上分配或者標(biāo)量替換
  • 如果逃逸分析能夠證明某些新建的對(duì)象不逃逸,那么 Java 虛擬機(jī)完全可以將其分配至棧上蝇裤,并且在 new 語句所在的方法退出時(shí)廷支,通過彈出當(dāng)前方法的棧楨來自動(dòng)回收所分配的內(nèi)存空間
    • 不過频鉴,由于實(shí)現(xiàn)起來需要更改大量假設(shè)了“對(duì)象只能堆分配”的代碼,因此 HotSpot 虛擬機(jī)并沒有采用棧上分配恋拍,而是使用了標(biāo)量替換這么一項(xiàng)技術(shù)
  • 標(biāo)量替換
    • 所謂的標(biāo)量垛孔,就是僅能存儲(chǔ)一個(gè)值的變量,比如 Java 代碼中的局部變量
    • 與之相反施敢,聚合量則可能同時(shí)存儲(chǔ)多個(gè)值周荐,其中一個(gè)典型的例子便是 Java 對(duì)象
    • 標(biāo)量替換這項(xiàng)優(yōu)化技術(shù),可以看成將原本對(duì)對(duì)象的字段的訪問僵娃,替換為一個(gè)個(gè)局部變量的訪問

部分逃逸分析

部分逃逸分析將根據(jù)控制流信息概作,判斷出新建對(duì)象僅在部分分支中逃逸,并且將對(duì)象的新建操作推延至對(duì)象逃逸的分支中悯许。這將使得原本因?qū)ο筇右荻鵁o法避免的新建對(duì)象操作仆嗦,不再出現(xiàn)在只執(zhí)行 if-else 分支的程序路徑之中

  • 與 C2 所使用的逃逸分析相比辉阶,Graal 所使用的部分逃逸分析能夠優(yōu)化更多的情況先壕,不過它編譯時(shí)間也更長(zhǎng)一些
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谆甜,隨后出現(xiàn)的幾起案子垃僚,更是在濱河造成了極大的恐慌,老刑警劉巖规辱,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谆棺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡罕袋,警方通過查閱死者的電腦和手機(jī)改淑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浴讯,“玉大人朵夏,你說我怎么就攤上這事∮芘Γ” “怎么了仰猖?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)奈籽。 經(jīng)常有香客問我饥侵,道長(zhǎng),這世上最難降的妖魔是什么衣屏? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任躏升,我火速辦了婚禮,結(jié)果婚禮上狼忱,老公的妹妹穿的比我還像新娘膨疏。我一直安慰自己盗温,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布成肘。 她就那樣靜靜地躺著卖局,像睡著了一般。 火紅的嫁衣襯著肌膚如雪双霍。 梳的紋絲不亂的頭發(fā)上砚偶,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音洒闸,去河邊找鬼染坯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丘逸,可吹牛的內(nèi)容都是我干的单鹿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼深纲,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼仲锄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起湃鹊,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤儒喊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后币呵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怀愧,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年余赢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芯义。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡妻柒,死狀恐怖扛拨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛤奢,我是刑警寧澤鬼癣,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站啤贩,受9級(jí)特大地震影響待秃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜痹屹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一章郁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦暖庄、人聲如沸聊替。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惹悄。三九已至,卻和暖如春肩钠,著一層夾襖步出監(jiān)牢的瞬間泣港,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國打工价匠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留当纱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓踩窖,卻偏偏與公主長(zhǎng)得像坡氯,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子洋腮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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

  • 一是對(duì)象是否被存入堆中(靜態(tài)字段或者堆中對(duì)象的實(shí)例字段)箫柳,二是對(duì)象是否被傳入未知代碼中。 一旦對(duì)象被存入堆中徐矩,其他...
    小王ovo閱讀 271評(píng)論 0 0
  • 運(yùn)行期優(yōu)化 樓主最近在網(wǎng)上看到一篇寫關(guān)于JVM運(yùn)行期優(yōu)化的博客滞时,經(jīng)過整理叁幢,現(xiàn)在分享給大家: 我們知道滤灯,Java 是...
    qiaoflin閱讀 405評(píng)論 0 0
  • 逃逸分析、 鎖消除曼玩、 鎖膨脹鳞骤、 方法內(nèi)聯(lián)、 空值檢查消除黍判、 類型檢測(cè)消除豫尽、 公共子表達(dá)式消除 在Java的編譯體系...
    zjkdifvpwlkqumn閱讀 270評(píng)論 0 0
  • 在Java的編譯體系中,一個(gè)Java的源代碼文件變成計(jì)算機(jī)可執(zhí)行的機(jī)器指令的過程中顷帖,需要經(jīng)過兩段編譯美旧,第一段是把....
    _心碎烏托邦_閱讀 204評(píng)論 0 0
  • 前言:最近在H大的公眾號(hào)學(xué)習(xí)了很多關(guān)于JVM相關(guān)的知識(shí),本文為學(xué)習(xí)總結(jié)贬墩,參考于公眾號(hào):Hollis榴嗅,原文標(biāo)題如下:...
    Vechace閱讀 1,349評(píng)論 1 8