內存分配與回收策略

內存分配與回收策略算法

    1.對象優先在Eden分配安全

        大多數狀況下,對象在新生代Eden區中分配。當Eden區沒有足夠空間進行分配時,虛擬機將發起一次Minor GC。ide

        -XX:+PrintGCDetails:在發生垃圾收集行爲時打印內存回收日誌,而且在進程退出的時候輸出當前的內存各區域分配狀況。spa

        -XX:SurvivorRatio=8決定了新生代中Eden區與一個Survivor區的空間比例是8:1。日誌

        新生代GC(Minor GC):發生在新生代的垃圾收集動做,由於Java對象大多都具有朝生夕滅的特性,因此Minor GC很是頻繁,通常回收速度也很是快。對象

        老年代GC(Major GC/Full GC):指發生在老年代的GC,出現了Major GC常常會伴隨至少一次Minor GC(非絕對,在Parallel Scavenge收集器的收集策略就有直接進行Major GC的策略選擇過程)。Major GC速度通常會比Minor GC慢10倍以上。進程

    

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

        大對象:須要大量連續內存空間的Java對象,虛擬機

        -XX:PretenureSizeThreshold:令大於這個設置值的對象直接在老年代分配。目的是避免在Eden區及兩個Survivor區直接發生大量的內存複製(新生代採用複製算法收集內存)。該參數只對Serial和ParNew兩款收集器有效。it

    

    3.長期存活的對象將進入老年代

        爲了在內存回收時能區別哪些對象應放在新生代,哪些對象應放在老年代中,虛擬機給每一個對象定義了一個對象年齡(Age)計數器。

        若是對象在Eden出生並通過第一次Minor GC後仍然存活,而且能被Survivor容納的話,將被移動到Survivor空間中,而且對象年齡設爲1。對象在Survivor區中每熬過一次Minor GC,年齡就增長1歲,當它的年齡增長到必定程度(默認爲15歲),就將會被晉升到老年代中。對象晉升老年代的年齡閾值,能夠經過參數-XX:MaxTenuringThreshold設置。


    4.動態對象年齡判斷

        虛擬機並非嚴格要求對象年齡必須達到MaxTenuringThreshold才能晉升老年代,若是子啊Survivor空間中相同年齡全部對象大小和總和大於Survivor空間的一半,年齡大於或等於該年齡的對象就能夠直接進入老年代,無需等到MaxTenuringThreshold中要求的年齡。

    

    5.空間分配擔保

        在發生Minor GC以前,虛擬機會先檢查老年代最大可用的連續空間是否大於新生代全部對象總空間,若是該條件成立,則Minor GC能夠肯定是安全的。若是不成立,則虛擬機會查看HandlePromotionFailure設置值是否容許擔保失敗。若是容許,那麼會檢查老年代最大可用的連續空間是否大於歷次晉升到老年代對象的平均大小,若是大於,將嘗試進行一次Minor GC,儘管此次的Minor GC是有風險的;或者HandlePromotionFailure設置不容許冒險,那這時也要改成進行一次Full GC。

        新生代使用複製收集算法,爲了內存利用率,只是用其中一個Survivor空間來做爲輪換備份,所以當出現大量對象在Minor GC後仍然存活的狀況,就須要蘭年度進行分配擔保,吧Survivor沒法容納的對象直接進入老年代。老年代要進行這樣的擔保,前提是老年代自己還有容納這些對象的剩餘空間。

        JDK1.6以後的規則變爲只要老年代的連續空間大於新生代對象總大小或者歷次晉升的平均大小就會進行Minor GC,不然將進行Full GC。HandlePromotionFailure參數不會再影響到虛擬機的空間分配擔保策略。

相關文章
相關標籤/搜索