1.新生代:對象優先在Eden分配
(1)HotSpot JVM把年輕代分爲了三部分:1個Eden區和2個Survivor區(分別叫from和to)。當Eden沒有足夠空間進行分配,虛擬機將發起一次MInor GC算法
b:設置兩個Survivor區最大的好處就是解決了碎片化spa
(2)年輕代(新生代)的總可用空間爲:Eden區+1個Survivor區的總容量.net
(3)默認比例爲8:1(-XX:SurvivorRatio=8 決定了新生代中Eden區域一個Survivor區的比例爲8:1)。對象
(4)在JVM的內存分配時,會用到內存分配擔保機制。就是當在新生代沒法分配內存的時候,把新生代的對象轉移到老生代,而後把新對象放入騰空的新生代。blog
(5)新生代採用複製算法收集內存內存
2.大對象直接進入老年代虛擬機
(1)虛擬機提供了一個-XX:PretenureSizeThreshold參數,令大於這個設置值的對象直接在老年代分配。(只對Serial和ParNew兩款收集器有效)it
目的:避免在Eden區和兩個Survivor區之間發生大量的內存複製io
注意:這個參數不能像-Xmx之類的參數同樣直接寫3MB(eg:-XX:PretenureSizeThreshold=3145728)class
3.長期存活的對象將進入老年代
(1)虛擬機採用分代收集的思想管理內存,虛擬機給每一個對象定義了一個對象年齡計數器。if對象在Eden出生並經歷過第一次Minor GC後仍然存活,而且能被Survivor容納的話,將被移動到Survivor空間中,而且對象年齡設爲1。對象在Survivor區中沒「熬過」一次Minor GC,年齡就增長一歲,當它的年齡增長到必定程度(默認15),將會被緊急到老年代中。對象晉升老年代的年齡閾值可經過-Xx:MaxTenuringThreshold設置
4.動態對象年齡斷定
虛擬機並非永遠的要求對象的年齡必須達到MaxTenuringThreshold才晉升老年代,若是Survivor空間中相同年齡全部對象大小的總和大於Survivor空間的一半,年齡大於或等於該年齡的對象就能夠直接進入老年代,無須等到MaxTenuringThreshold中要求的年齡。
5.分配擔保機制
當新生代沒法分配內存的時候,把新生代的對象轉移到老生代,而後把新對象放入騰空的新生代
GC: