對象優先在新生代Eden區中分配數組
當Eden區沒有足夠空間進行分配時,虛擬機將發起一次Minor GC,虛擬機提供了-XX:+PrintGCDetails這個收集器日誌參數。安全
Minor GC 與 Full GC比較:學習
新生代GC (Minor GC)指 發生在新生代的垃圾回收,Java對象大多具有朝生熄滅的特性,因此Minor GC很是頻繁,回收速度也很快。.net
老年代GC (Major GC/ Full GC)指發生在老年代的GC,出現了Major GC常常會伴隨至少一次的Minor GC(非絕對,Parallel Scavenge收集器的收集策略裏就有進行Major GC的策略選擇過程)。Major GC的速度通常會比Minor GC慢10倍以上。日誌
大對象直接進入老年代對象
大對象是指須要大量連續內存空間的Java對象,典型的大對象如很長的字符串對象以及數組,常常出現大對象容易致使內存還有很多空間時就提早觸發垃圾收集以獲取足夠的連續空間來「安置」它們,虛擬機提供了一個-XX:PretenureSizeThreshold參數,令大於這個設置值的對象直接在老年代分配,目的是避免在Eden區和兩個倖存區之間發生大量的內存複製blog
長期存活的對象將進入老年代內存
虛擬機採用了分代收集的思想來管理內存,能識別哪些對象應該放在新生代,哪些對象應該放在老年代中。字符串
虛擬機給每一個對象定義了一個對象年齡(Age)計數器(GC分代年齡)。見JVM學習總結(二)Java對象get
若是對象在Eden出生並通過第一次Minor GC後仍然存活,而且可以被Survivor容納的話,將被移動到Survivor空間中,而且對象年齡設爲1。
對象在Survivor區中每熬過一次Minor GC,年齡就增長1歲,當它的年齡增長到必定程度(默認爲15歲),就將會被晉升到老年代中。
能夠經過-XX:MaxTenuringThreshold參數設置對象晉升老年代的年齡閾值。
動態對象年齡判斷
爲了能更好地適應不一樣程序的內存情況,虛擬機並非永遠地要求對象的年齡必須達到了MaxTenuringThreshold才能晉升老年代,若是在Survivor空間中相同年齡全部的對象大小的總和大於Survivor空間的一半,年齡大於或等於該年齡的對象就能夠直接進入老年代,無須等到MaxTenuringThreshold中要求的年齡。
空間分配擔保
在發生Minor GC以前,虛擬機會先檢查老年代最大可用的連續空間是否大於新生代全部對象總和,若是這個條件成立,那麼Minor GC能夠確保是安全的。若是不成立,則虛擬機會查看HandlePromotionFailure設置值是否容許擔保失敗。若是容許,那麼將會繼續檢查老年代中最大可用的連續內存是否大於歷次晉升到老年代對象的平均大小,若是大於,將嘗試着進行一次Minor GC, 儘管此次Minor GC是有風險的;若是小於,或者HandlePromotionFailure設置不容許冒險,那這時也要改成一次進行一次Full GC。