JVM空間分配擔(dān)保

文章來(lái)源:深入理解jvm空間分配擔(dān)保
JDK 6 Update 24在發(fā)生Minor GC之前刽宪,虛擬機(jī)必須先檢查老年代最大可用的連續(xù)空間是否大于新生 代所有對(duì)象總空間瘦麸,如果這個(gè)條件成立只酥,那這一次Minor GC可以確保是安全的奕翔。如果不 成立从橘,則虛擬機(jī)會(huì)先查看-XX:HandlePromotionFailure參數(shù)的設(shè)置值是否允許擔(dān)保失敗 (Handle Promotion Failure)楼熄;如果允許,那會(huì)繼續(xù)檢查老年代最大可用的連續(xù)空間是否 大于歷次晉升到老年代對(duì)象的平均大小闸与,如果大于毙替,將嘗試進(jìn)行一次Minor GC,盡管這 次Minor GC是有風(fēng)險(xiǎn)的践樱;如果小于厂画,或者-XX:HandlePromotionFailure設(shè)置不允許冒險(xiǎn), 那這時(shí)就要改為進(jìn)行一次Full GC拷邢。 解釋一下“冒險(xiǎn)”是冒了什么風(fēng)險(xiǎn):前面提到過(guò)袱院,新生代使用復(fù)制收集算法,但為了內(nèi) 存利用率瞭稼,只使用其中一個(gè)Survivor空間來(lái)作為輪換備份忽洛,因此當(dāng)出現(xiàn)大量對(duì)象在Minor GC后仍然存活的情況——最極端的情況就是內(nèi)存回收后新生代中所有對(duì)象都存活,需要 老年代進(jìn)行分配擔(dān)保环肘,把Survivor無(wú)法容納的對(duì)象直接送入老年代欲虚,這與生活中貸款擔(dān)保 類似。老年代要進(jìn)行這樣的擔(dān)保悔雹,前提是老年代本身還有容納這些對(duì)象的剩余空間复哆,但一 共有多少對(duì)象會(huì)在這次回收中活下來(lái)在實(shí)際完成內(nèi)存回收之前是無(wú)法明確知道的,所以只 能取之前每一次回收晉升到老年代對(duì)象容量的平均大小作為經(jīng)驗(yàn)值荠商,與老年代的剩余空間 進(jìn)行比較寂恬,決定是否進(jìn)行Full GC來(lái)讓老年代騰出更多空間续誉。 取歷史平均值來(lái)比較其實(shí)仍然是一種賭概率的解決辦法莱没,也就是說(shuō)假如某次Minor GC存活后的對(duì)象突增,遠(yuǎn)遠(yuǎn)高于歷史平均值的話酷鸦,依然會(huì)導(dǎo)致?lián)J∈味恪H绻霈F(xiàn)了擔(dān) 保失敗牙咏,那就只好老老實(shí)實(shí)地重新發(fā)起一次Full GC,這樣停頓時(shí)間就很長(zhǎng)了嘹裂。雖然擔(dān)保 失敗時(shí)繞的圈子是最大的妄壶,但通常情況下都還是會(huì)將-XX:HandlePromotionFailure開(kāi)關(guān)打 開(kāi),避免Full GC過(guò)于頻繁寄狼。參見(jiàn)代碼如下(JDK 6 Update 24)之前的 HotSpot運(yùn)行測(cè)試代碼丁寄。

private static final int _1MB = 1024 * 1024; 
/*** VM參數(shù):-Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:-Handle- PromotionFailure */ @SuppressWarnings("unused")
 public static void testHandlePromotion() { 
byte[] allocation1, allocation2, allocation3, allocation4, allocation5, alloca-tion6, allocation7; 
allocation1 = new byte[2 * _1MB];
allocation2 = new byte[2 * _1MB]; 
allocation3 = new byte[2 * _1MB]; 
allocation1 = null; 
allocation4 = new byte[2 * _1MB];
allocation5 = new byte[2 * _1MB]; 
allocation6 = new byte[2 * _1MB]; 
allocation4 = null; 
allocation5 = null; 
allocation6 = null; 
allocation7 = new byte[2 * _1MB]; 
}

以-XX:HandlePromotionFailure=false參數(shù)來(lái)運(yùn)行的結(jié)果:

[GC [DefNew: 6651K->148K(9216K), 0.0078936 secs] 6651K->4244K(19456K), 0.0079192 secs] [Times: user=0.00 sys=0.02, real=0.02 secs] [GC [DefNew: 6378K->6378K(9216K), 0.0000206 secs][Tenured: 4096K->4244K(10240K), 0.0042901 secs] 10474K->42

以-XX:HandlePromotionFailure=true參數(shù)來(lái)運(yùn)行的結(jié)果:

[GC [DefNew: 6651K->148K(9216K), 0.0054913 secs] 6651K->4244K(19456K), 0.0055327 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [GC [DefNew: 6378K->148K(9216K), 0.0006584 secs] 10474K->4244K(19456K), 0.0006857 secs] [Times: user=0.00 s

在JDK 6 Update 24之后,這個(gè)測(cè)試結(jié)果就有了差異泊愧,-XX:HandlePromotionFailure參 數(shù)不會(huì)再影響到虛擬機(jī)的空間分配擔(dān)保策略伊磺,觀察OpenJDK中的源碼變化(參見(jiàn)如下代碼),雖然源碼中還定義了-XX:HandlePromotionFailure參數(shù)删咱,但是在實(shí)際虛擬機(jī)中已經(jīng) 不會(huì)再使用它屑埋。JDK 6 Update 24之后的規(guī)則變?yōu)橹灰夏甏倪B續(xù)空間大于新生代對(duì)象總 大小或者歷次晉升的平均大小,就會(huì)進(jìn)行Minor GC痰滋,否則將進(jìn)行Full GC摘能。

bool TenuredGeneration::promotion_attempt_is_safe(size_t max_promotion_in_bytes) const {
 // 老年代最大可用的連續(xù)空間 
size_t available = max_contiguous_available();
 // 每次晉升到老年代的平均大小 
size_t av_promo = (size_t)gc_stats()->avg_promoted()->padded_average();
 // 老年代可用空間是否大于平均晉升大小,或者老年代可用空間是否大于當(dāng)此GC時(shí)新生代所有對(duì)象容量 
bool res = (available >= av_promo) || (available >= max_promotion_in_bytes); return res; }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末敲街,一起剝皮案震驚了整個(gè)濱河市团搞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌多艇,老刑警劉巖莺丑,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異墩蔓,居然都是意外死亡梢莽,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門奸披,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)昏名,“玉大人,你說(shuō)我怎么就攤上這事阵面∏峋郑” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵样刷,是天一觀的道長(zhǎng)仑扑。 經(jīng)常有香客問(wèn)我,道長(zhǎng)置鼻,這世上最難降的妖魔是什么镇饮? 我笑而不...
    開(kāi)封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮箕母,結(jié)果婚禮上储藐,老公的妹妹穿的比我還像新娘俱济。我一直安慰自己,他們只是感情好钙勃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布蛛碌。 她就那樣靜靜地躺著,像睡著了一般辖源。 火紅的嫁衣襯著肌膚如雪蔚携。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天克饶,我揣著相機(jī)與錄音浮梢,去河邊找鬼。 笑死彤路,一個(gè)胖子當(dāng)著我的面吹牛秕硝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播洲尊,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼远豺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了坞嘀?” 一聲冷哼從身側(cè)響起躯护,我...
    開(kāi)封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丽涩,沒(méi)想到半個(gè)月后棺滞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矢渊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年继准,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矮男。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡移必,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出毡鉴,到底是詐尸還是另有隱情崔泵,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布猪瞬,位于F島的核電站憎瘸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏陈瘦。R本人自食惡果不足惜幌甘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧含潘,春花似錦、人聲如沸线婚。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)塞弊。三九已至漱逸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間游沿,已是汗流浹背饰抒。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诀黍,地道東北人袋坑。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像眯勾,于是被迫代替她去往敵國(guó)和親枣宫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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