jvm逃逸分析

首先先看一個(gè)問題,對象是否都被分配到了堆內(nèi)存中儒鹿?

眾所周知java中對象都默認(rèn)被分配到堆中化撕,在棧中,只保存了對象的指引约炎,當(dāng)對象不再使用后植阴,需要依賴GC來遍歷引用樹并回收內(nèi)存。如果堆中對象太多圾浅,回收對象整理內(nèi)存掠手,都會(huì)帶來時(shí)間上的消耗。所以在開發(fā)中贱傀,如何優(yōu)化棧堆內(nèi)存都是比較重要的問題惨撇。

1. 為什么逃逸

在計(jì)算機(jī)語言編譯器優(yōu)化原理中,逃逸分析是指分析指針動(dòng)態(tài)范圍的方法府寒,它同編譯器優(yōu)化原理的指針分析和外形分析相關(guān)聯(lián)魁衙。當(dāng)變量(或者對象)在方法中分配后,其指針有可能被返回或者被全局引用株搔,這樣就會(huì)被其他方法或者線程所引用剖淀,這種現(xiàn)象稱作指針(或者引用)的逃逸(Escape)。通俗點(diǎn)講纤房,如果一個(gè)對象的指針被多個(gè)方法或者線程引用時(shí)纵隔,那么我們就稱這個(gè)對象的指針(或?qū)ο螅┑奶右荩‥scape)。

使用一段代碼理解:

public StringBuilder escapeDemo1(String a, String b) {
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append(a);
    stringBuilder.append(b);
    return stringBuilder;
}

stringBuilder是在方法的內(nèi)部變量炮姨,而此時(shí)它被直接返回捌刮,這樣stringBuilder就有可能被其他地方的方法或參數(shù)所改變,這樣它的作用域就不只是demo1了舒岸,雖然它是一個(gè)局部變量绅作,但其發(fā)生了“逃逸”。

改造一下代碼:

public String escapeDemo2(String a, String b) {
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append(a);
    stringBuilder.append(b);
    return stringBuilder.toString();
}

如此蛾派,就沒有返回StringBuilder俄认,而是toString(),那么StringBuilder沒有從方法中直接脫離洪乍,就沒有發(fā)生逃逸眯杏。

2. 什么是逃逸分析?

逃逸分析壳澳,是一種可以有效減少Java 程序中同步負(fù)載和內(nèi)存堆分配壓力的跨函數(shù)全局?jǐn)?shù)據(jù)流分析算法岂贩。通過逃逸分析,Java Hotspot編譯器能夠分析出一個(gè)新的對象的引用的使用范圍從而決定是否要將這個(gè)對象分配到堆上巷波。 逃逸分析(Escape Analysis)算是目前Java虛擬機(jī)中比較前沿的優(yōu)化技術(shù)了河闰。

原理:

Java本身的限制(對象只能分配到堆中)科平,我可以這么理解了褥紫,為了減少臨時(shí)對象在堆內(nèi)分配的數(shù)量姜性,我會(huì)在一個(gè)方法體內(nèi)定義一個(gè)局部變量,并且該變量在方法執(zhí)行過程中未發(fā)生逃逸髓考,按照J(rèn)VM調(diào)優(yōu)機(jī)制部念,首先會(huì)在堆內(nèi)存創(chuàng)建類的實(shí)例,然后將此對象的引用壓入調(diào)用棧氨菇,繼續(xù)執(zhí)行儡炼,這是JVM優(yōu)化前的方式。然后查蓉,我采用逃逸分析對JVM進(jìn)行優(yōu)化乌询。即針對棧的重新分配方式,首先找出未逃逸的變量豌研,將該變量直接存到棧里妹田,無需進(jìn)入堆,分配完成后鹃共,繼續(xù)調(diào)用棧內(nèi)執(zhí)行鬼佣,最后線程執(zhí)行結(jié)束,椝。空間被回收晶衷,局部變量也被回收了。如此操作阴孟,是優(yōu)化前在堆中晌纫,優(yōu)化后在棧中,從而減少了堆中對象的分配和銷毀永丝,從而優(yōu)化性能锹漱。

方式:

方法逃逸:在一個(gè)方法體內(nèi),定義一個(gè)局部變量类溢,而它可能被外部方法引用凌蔬,比如作為調(diào)用參數(shù)傳遞給方法,或作為對象直接返回闯冷∩靶模或者,可以理解成對象跳出了方法蛇耀。

線程逃逸:這個(gè)對象被其他線程訪問到辩诞,比如賦值給了實(shí)例變量,并被其他線程訪問到了纺涤。對象逃出了當(dāng)前線程译暂。

好處:

如果一個(gè)對象不會(huì)在方法體內(nèi)抠忘,或線程內(nèi)發(fā)生逃逸(或者說是通過逃逸分析后,使其未能發(fā)生逃逸)

  1. 棧上分配:一般情況下外永,不會(huì)逃逸的對象所占空間比較大崎脉,如果能使用棧上的空間,那么大量的對象將隨方法的結(jié)束而銷毀伯顶,減輕了GC壓力囚灼。
  2. 同步消除(鎖消除):如果你定義的類的方法上有同步鎖,但在運(yùn)行時(shí)祭衩,卻只有一個(gè)線程在訪問灶体,此時(shí)通過逃逸分析后會(huì)去掉同步鎖運(yùn)行。
  3. 標(biāo)量替換:Java虛擬機(jī)中的原始數(shù)據(jù)類型(int掐暮,long等數(shù)值類型以及reference類型等)都不能再進(jìn)一步分解蝎抽,它們可以稱為標(biāo)量。相對的路克,如果一個(gè)數(shù)據(jù)可以繼續(xù)分解樟结,那它稱為聚合量,Java中最典型的聚合量是對象衷戈。如果逃逸分析證明一個(gè)對象不會(huì)被外部訪問狭吼,并且這個(gè)對象是可分解的,那程序真正執(zhí)行的時(shí)候?qū)⒖赡懿粍?chuàng)建這個(gè)對象殖妇,而改為直接創(chuàng)建它的若干個(gè)被這個(gè)方法使用到的成員變量來代替刁笙。拆散后的變量便可以被單獨(dú)分析與優(yōu)化,可以各自分別在棧幀或寄存器上分配空間谦趣,原本的對象就無需整體分配空間了疲吸。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市前鹅,隨后出現(xiàn)的幾起案子摘悴,更是在濱河造成了極大的恐慌,老刑警劉巖舰绘,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹂喻,死亡現(xiàn)場離奇詭異,居然都是意外死亡捂寿,警方通過查閱死者的電腦和手機(jī)口四,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秦陋,“玉大人蔓彩,你說我怎么就攤上這事。” “怎么了赤嚼?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵旷赖,是天一觀的道長。 經(jīng)常有香客問我更卒,道長等孵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任逞壁,我火速辦了婚禮流济,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腌闯。我一直安慰自己,他們只是感情好雕憔,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布姿骏。 她就那樣靜靜地躺著,像睡著了一般斤彼。 火紅的嫁衣襯著肌膚如雪分瘦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天琉苇,我揣著相機(jī)與錄音嘲玫,去河邊找鬼。 笑死并扇,一個(gè)胖子當(dāng)著我的面吹牛去团,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播穷蛹,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼土陪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肴熏?” 一聲冷哼從身側(cè)響起鬼雀,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛙吏,沒想到半個(gè)月后源哩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸦做,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年励烦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馁龟。...
    茶點(diǎn)故事閱讀 38,646評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡崩侠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情却音,我是刑警寧澤改抡,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站系瓢,受9級特大地震影響阿纤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜夷陋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一欠拾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骗绕,春花似錦藐窄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撤缴,卻和暖如春刹枉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屈呕。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工微宝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虎眨。 一個(gè)月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓蟋软,卻偏偏與公主長得像,于是被迫代替她去往敵國和親专甩。 傳聞我的和親對象是個(gè)殘疾皇子钟鸵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評論 2 348

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