(8)JVM的逃逸分析(上)

一、為什么“逃逸”

逃逸分析是指分析指針動(dòng)態(tài)范圍 的方法:同編譯器優(yōu)化原理的指針?lè)治龊屯庑畏治?/b>相關(guān)聯(lián)箭启。當(dāng)變量(或者對(duì)象)在方法中分配后越走,其指針有可能被返回或者被全局引用,就會(huì)其他方法或者線程所引用催享,稱逃逸杭隙。????通俗講,一個(gè)對(duì)象指針被多個(gè)方法或者線程引用時(shí)

public StringBuilder escapeDemo1(String a, String b) {

????StringBuilder stringBuilder = new StringBuilder();

????stringBuilder.append(a);

????stringBuilder.append(b);

????return?stringBuilder;

}

stringBuilder是方法內(nèi)部變量被直接返回因妙,stringBuilder可能被其他地方的方法或參數(shù)所改變痰憎,作用域不只是demo1票髓,雖是局部變量,但“逃逸”铣耘。

public String escapeDemo2(String a, String b) {

????StringBuilder stringBuilder = new StringBuilder();

????stringBuilder.append(a);

????stringBuilder.append(b);

????return?stringBuilder.toString();//沒(méi)有發(fā)生逃逸洽沟。

}

二、什么是逃逸分析

目的:有效減少Java 程序中??同步負(fù)載和內(nèi)存堆分配壓力??的跨函數(shù)全局?jǐn)?shù)據(jù)流分析算法蜗细。

Java Hotspot編譯器分析出一個(gè)新的對(duì)象的引用使用范圍從而決定是否要將這個(gè)對(duì)象分配到堆上裆操。前沿優(yōu)化技術(shù)了。

三炉媒、逃逸分析的原理

Java本身的限制(對(duì)象只能分配到堆中)踪区,為了減少臨時(shí)對(duì)象在堆內(nèi)分配的數(shù)量,方法體內(nèi)定義局部變量吊骤,該變量在方法執(zhí)行過(guò)程中未發(fā)生逃逸缎岗,

????按照JVM調(diào)優(yōu)機(jī)制,1)先內(nèi)存創(chuàng)建白粉,2)將對(duì)象引用壓入調(diào)用传泊,3)繼續(xù)執(zhí)行。

????用逃逸分析對(duì)JVM進(jìn)行優(yōu)化棧重新分配方式蜗元,1)先找未逃逸變量或渤,2)將變量直接棧里無(wú)需進(jìn)入堆奕扣,3)分配完薪鹦,繼續(xù)調(diào)用棧內(nèi)執(zhí)行,最后線程執(zhí)行結(jié)束惯豆,棾卮牛空間被回收,局部變量也被回收了楷兽。優(yōu)化前在堆中地熄,優(yōu)化后在棧中

四、逃逸的方式

  方法逃逸:對(duì)象跳出了方法(上面代碼)

  線程逃逸:對(duì)象被其他線程訪問(wèn)芯杀,賦值給實(shí)例變量端考,并被其他線程訪問(wèn)。對(duì)象逃出當(dāng)前線程揭厚。

五却特、逃逸分析的好處

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

1.?棧上分配

不逃逸的對(duì)象所占空間大裂明,用棧空間太援,大量的對(duì)象將隨方法的結(jié)束而銷毀闽晦,減輕了GC壓力

2. 同步消除

類的方法上有同步鎖扳碍,運(yùn)行時(shí),只有一個(gè)線程在訪問(wèn)仙蛉,此時(shí)逃逸分析后的機(jī)器碼笋敞,會(huì)去掉同步鎖運(yùn)行

3. 標(biāo)量替換

標(biāo)量:不可分解原始數(shù)據(jù)類型(int捅儒,long等數(shù)值類型以及reference類型等)

聚合量可分解數(shù)據(jù)(對(duì)象)

如果逃逸分析證明一個(gè)可分解對(duì)象不會(huì)被外部訪問(wèn)液样,那程序真正執(zhí)行的時(shí)候?qū)⒖赡?b>不創(chuàng)建這個(gè)對(duì)象,而改為直接創(chuàng)建它的若干個(gè)被這個(gè)方法使用到的成員變量來(lái)代替巧还。拆散后的變量便可以被單獨(dú)分析與優(yōu)化,可以各自分別棧幀寄存器上分配空間坊秸,原本的對(duì)象就無(wú)需整體分配空間麸祷。

六、開啟設(shè)置

在JDK 6u23以上是默認(rèn)開啟褒搔,這里將設(shè)置重新明確一下:?

強(qiáng)制開啟:1-server -XX:+DoEscapeAnalysis -XX:+PrintGCDetail -Xmx10m -Xms10m

關(guān)閉逃逸分析:1-server -XX:-DoEscapeAnalysis -XX:+PrintGCDetail -Xmx10m -Xms10m

寫在結(jié)尾

椊纂梗空間一般小,無(wú)法存儲(chǔ)大容量數(shù)據(jù)星瘾。目前的實(shí)現(xiàn)都是采用不那么準(zhǔn)確但是時(shí)間壓力相對(duì)較小的算法來(lái)完成逃逸分析走孽,可能導(dǎo)致效果不穩(wěn)定。逃逸分析的效果只能在滿足高頻和高數(shù)量的小容量的變量分配結(jié)構(gòu)琳状,才是合適的磕瓷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市念逞,隨后出現(xiàn)的幾起案子困食,更是在濱河造成了極大的恐慌,老刑警劉巖翎承,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硕盹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡叨咖,警方通過(guò)查閱死者的電腦和手機(jī)瘩例,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)甸各,“玉大人垛贤,你說(shuō)我怎么就攤上這事〕栈蓿” “怎么了南吮?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)誊酌。 經(jīng)常有香客問(wèn)我部凑,道長(zhǎng)露乏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任涂邀,我火速辦了婚禮瘟仿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘比勉。我一直安慰自己劳较,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布浩聋。 她就那樣靜靜地躺著观蜗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪衣洁。 梳的紋絲不亂的頭發(fā)上墓捻,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音坊夫,去河邊找鬼砖第。 笑死,一個(gè)胖子當(dāng)著我的面吹牛环凿,可吹牛的內(nèi)容都是我干的梧兼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼智听,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼羽杰!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起瞭稼,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤忽洛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后环肘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欲虚,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年悔雹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了复哆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腌零,死狀恐怖梯找,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情益涧,我是刑警寧澤锈锤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響久免,放射性物質(zhì)發(fā)生泄漏浅辙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一阎姥、第九天 我趴在偏房一處隱蔽的房頂上張望记舆。 院中可真熱鬧,春花似錦呼巴、人聲如沸泽腮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)诊赊。三九已至,卻和暖如春屑埋,著一層夾襖步出監(jiān)牢的瞬間豪筝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工摘能, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人敲街。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓团搞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親多艇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逻恐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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

  • 一、運(yùn)行時(shí)數(shù)據(jù)區(qū)域 Java虛擬機(jī)管理的內(nèi)存包括幾個(gè)運(yùn)行時(shí)數(shù)據(jù)內(nèi)存:方法區(qū)峻黍、虛擬機(jī)棧复隆、本地方法棧、堆姆涩、程序計(jì)數(shù)器挽拂,...
    luhanlin閱讀 541評(píng)論 0 0
  • ??我們都知道Java中的對(duì)象默認(rèn)都是分配到堆上,在調(diào)用棧中骨饿,只保存了對(duì)象的指針亏栈。當(dāng)對(duì)象不再使用后,需要依靠GC來(lái)...
    guoliang閱讀 600評(píng)論 0 1
  • 第二部分 自動(dòng)內(nèi)存管理機(jī)制 第二章 java內(nèi)存異常與內(nèi)存溢出異常 運(yùn)行數(shù)據(jù)區(qū)域 程序計(jì)數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)...
    小明oh閱讀 1,138評(píng)論 0 2
  • Java8張圖 11宏赘、字符串不變性 12绒北、equals()方法、hashCode()方法的區(qū)別 13察署、...
    Miley_MOJIE閱讀 3,696評(píng)論 0 11
  • 所有知識(shí)點(diǎn)已整理成app app下載地址 J2EE 部分: 1.Switch能否用string做參數(shù)闷游? 在 Jav...
    侯蛋蛋_閱讀 2,412評(píng)論 1 4