java技術體系中所提倡的內存管理最終能夠歸爲自動化的解決了兩個問題:給對象分配內存已經回收分配給對象的內存。java
對象優先在Eden分配算法
大多數狀況下,對象在新生代Eden區中分配,當eden 區沒有足夠的空間進行分配時,虛擬機將發起一次Minor GC。 虛擬機提供了-XX:+PrintGCDetails 這個收集器日誌參數,告訴虛擬機在發生垃圾收集行爲時打印內存回收日誌,而且在進程退出的時候輸出當前內存各區域的分配狀況。數組
大對象直接進入年老代spa
所謂大對象就是指,須要大量連續內存空間的java 對象。最典型的大對象就是那種很長的字符串極數組。虛擬機提供了一個-xx:pretenureSizeTreshold 參數,令大於這個設置值的對象直接在老年代中分配。這樣作的目的是避免在Eden 區及兩個Survivor區之間發生大量的內存拷貝。(複習一下新生代採用的是複製算法)日誌
長期存活的對象將進入老年代
orm
虛擬機給每一個對象定義了一個對象年齡計數器,若是對象在Eden出生並通過第一次Minor GC 後仍然存活,而且能被Survivor 容納的話,將被移動到Survivor 空間中,並將對象年齡設置爲1.對象在在Survivor 中沒熬過一次 Minor GC 。年齡就增長1歲,當它的年齡正經到必定程度(默認爲15歲)時,就會被晉升到老年代中。
對象
總結進程
年輕代(Young Generation):對象被建立時,內存的分配首先發生在年輕代(大對象能夠直接被建立在年老代),大部分的對象在建立後很快就再也不使用,所以很快變得不可達,因而被年輕代的GC機制清理掉(IBM的研究代表,98%的對象都是很快消亡的),這個GC機制被稱爲Minor GC或叫Young GC。注意,Minor GC並不表明年輕代內存不足,它事實上只表示在Eden區上的GC。內存
老年代:字符串
老年代存儲的對象比年輕代多得多,並且不乏大對象,對老年代進行內存清理時,若是使用中止-複製算法,則至關低效。通常,老年代用的算法是標記-整理算法,即:標記出仍然存活的對象(存在引用的),將全部存活的對象向一端移動,以保證內存的連續。
在發生Minor GC時,虛擬機會檢查每次晉升進入老年代的大小是否大於老年代的剩餘空間大小,若是大於,則直接觸發一次Full GC,不然,就查看是否設置了-XX:+HandlePromotionFailure(容許擔保失敗),若是容許,則只會進行MinorGC,此時能夠容忍內存分配失敗;若是不容許,則仍然進行Full GC(這表明着若是設置-XX:+Handle PromotionFailure,則觸發MinorGC就會同時觸發Full GC,哪怕老年代還有不少內存,因此,最好不要這樣作)。