垃圾收集器與內存分配策略(二)

前言

  • 對象的內存分配,大多數(shù)都是在堆上分配的放吩,但是有一些在JIT編譯后被拆散為標量類型并間接地棧上分配(即進行了優(yōu)化)智听。在堆上,對象會被分配在新生代(主要)和老年代(少數(shù))中,但是如果啟動了本地線程分配緩沖(-XX:+/-UseTLAB參數(shù)指定)到推,將按線程優(yōu)先在TLAB上分配考赛。
  • 注:分配規(guī)則不是固定的,具體細節(jié)取決于當前使用的是哪一種垃圾收集器組合莉测,還有虛擬機中與內存相關的參數(shù)設置
  • 下面講解幾條最普遍的內存分配規(guī)則颜骤。

1.對象優(yōu)先在Eden分配

  • 堆上的大多數(shù)對象都是分配在新生代中,因為新生代采用的是復制算法捣卤,新生代中分為一個Eden區(qū)和兩個Survivor區(qū)忍抽,分配時會分配在Eden區(qū)和其中一個Survivor區(qū),當Eden+1個Survivor區(qū)沒有足夠空間分配時虛擬機將發(fā)起一次MinorGC董朝。此次收集會將Eden+1個Survivor區(qū)中不可達對象進行回收鸠项,并將存活的對象放入到另一個Survivor區(qū)中,然后再清理剛才使用的Eden+1個Survivor區(qū)子姜。注:如果Survivor區(qū)存不下Eden+1個Survivor區(qū)中存活下來的對象祟绊,就會采用分配擔保機制,將存活下來的對象轉移到老年代中哥捕。然后再清理剛才使用的Eden+1個Survivor區(qū)牧抽。

2.大對象直接進入老年代

  • 所謂的大對象是指,需要大量連續(xù)內存空間的Java對象遥赚,最典型的大對象就是那種很長的字符串以及數(shù)組扬舒。
  • 虛擬機提供了一個-XX:PretenureSizeThreshold參數(shù),令大于這個設置值的對象直接在老年代分配鸽捻。這樣做的目的是避免在Eden區(qū)及兩個Survivor區(qū)之間發(fā)生大量的內存復制(復習一下:新生代采用復制算法收集內存)呼巴。

3.長期存活對象進行老年代

  • 既然虛擬機采用了分代收集的思想來管理內存泽腮,那么內存回收時就必須能識別哪些對象應放在新生代御蒲,哪些對象應放在老年代中。為了做到這點诊赊,虛擬機給每個對象定義了一個對象年齡(Age)計數(shù)器厚满。如果對象在Eden出生并經(jīng)過第一次Minor GC后仍然存活,并且能被Survivor容納的話碧磅,將被移動到Survivor空間中碘箍,并且對象年齡設為1。對象在Survivor區(qū)中每“熬過”一次Minor GC鲸郊,年齡就增加1歲丰榴,當它的年齡增加到一定程度(默認為15歲),就將會被晉升到老年代中秆撮。
  • 對象晉升老年代的年齡閾值四濒,可以通過參數(shù)-XX:MaxTenuringThreshold設置。

4.動態(tài)對象年齡判定

  • 為了能更好地適應不同程序的內存狀況,虛擬機并不是永遠地要求對象的年齡必須達到了MaxTenuringThreshold才能晉升老年代盗蟆,如果在Survivor空間中相同年齡所有對象大小的總和大于Survivor空間的一半戈二,年齡大于或等于該年齡的對象就可以直接進入老年代,無須等到MaxTenuringThreshold中要求的年齡喳资。

空間分配擔保

  • 在發(fā)生Minor GC之前,虛擬機會先檢查老年代最大可用的連續(xù)空間是否大于新生代所有對象總空間,如果這個條件成立罢坝,那么Minor GC可以確保是安全的淋袖。如果不成立,則虛擬機會查看HandlePromotionFailure設置值是否允許擔保失敗节值。如果允許绒北,那么會繼續(xù)檢查老年代最大可用的連續(xù)空間是否大于歷次晉升到老年代對象的平均大小,如果大于察署,將嘗試著進行一次Minor GC闷游,盡管這次Minor GC是有風險的;如果小于贴汪,或者HandlePromotionFailure設置不允許冒險脐往,那這時也要改為進行一次Full GC。
  • **注:Minor GC和Full GC有什么不一樣嗎扳埂?
    新生代GC(Minor GC):指發(fā)生在新生代的垃圾收集動作业簿,因為Java對象大多都具備朝生夕滅的特性,所以Minor GC非常頻繁阳懂,一般回收速度也比較快梅尤。
    老年代GC(Major GC/Full GC):指發(fā)生在老年代的GC,出現(xiàn)了Major GC岩调,經(jīng)常會伴隨至少一次的Minor GC(但非絕對的巷燥,在Parallel Scavenge收集器的收集策略里就有直接進行Major GC的策略選擇過程)。Major GC的速度一般會比Minor GC慢10倍以上号枕。
    **
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末缰揪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子葱淳,更是在濱河造成了極大的恐慌钝腺,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,686評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赞厕,死亡現(xiàn)場離奇詭異艳狐,居然都是意外死亡,警方通過查閱死者的電腦和手機皿桑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評論 3 385
  • 文/潘曉璐 我一進店門毫目,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喷斋,“玉大人,你說我怎么就攤上這事蒜茴⌒亲Γ” “怎么了?”我有些...
    開封第一講書人閱讀 158,160評論 0 348
  • 文/不壞的土叔 我叫張陵粉私,是天一觀的道長顽腾。 經(jīng)常有香客問我,道長诺核,這世上最難降的妖魔是什么抄肖? 我笑而不...
    開封第一講書人閱讀 56,736評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮窖杀,結果婚禮上漓摩,老公的妹妹穿的比我還像新娘。我一直安慰自己入客,他們只是感情好管毙,可當我...
    茶點故事閱讀 65,847評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著桌硫,像睡著了一般夭咬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铆隘,一...
    開封第一講書人閱讀 50,043評論 1 291
  • 那天卓舵,我揣著相機與錄音,去河邊找鬼膀钠。 笑死掏湾,一個胖子當著我的面吹牛,可吹牛的內容都是我干的肿嘲。 我是一名探鬼主播融击,決...
    沈念sama閱讀 39,129評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼睦刃!你這毒婦竟也來了砚嘴?” 一聲冷哼從身側響起十酣,我...
    開封第一講書人閱讀 37,872評論 0 268
  • 序言:老撾萬榮一對情侶失蹤涩拙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后耸采,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兴泥,經(jīng)...
    沈念sama閱讀 44,318評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,645評論 2 327
  • 正文 我和宋清朗相戀三年虾宇,在試婚紗的時候發(fā)現(xiàn)自己被綠了搓彻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,777評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖旭贬,靈堂內的尸體忽然破棺而出怔接,到底是詐尸還是另有隱情,我是刑警寧澤稀轨,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布扼脐,位于F島的核電站,受9級特大地震影響奋刽,放射性物質發(fā)生泄漏瓦侮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一佣谐、第九天 我趴在偏房一處隱蔽的房頂上張望肚吏。 院中可真熱鬧,春花似錦狭魂、人聲如沸罚攀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坞生。三九已至,卻和暖如春掷伙,著一層夾襖步出監(jiān)牢的瞬間是己,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工任柜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卒废,地道東北人。 一個月前我還...
    沈念sama閱讀 46,589評論 2 362
  • 正文 我出身青樓宙地,卻偏偏與公主長得像摔认,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宅粥,可洞房花燭夜當晚...
    茶點故事閱讀 43,687評論 2 351

推薦閱讀更多精彩內容