內存分配與回收策略

 

1.新生代:對象優先在Eden分配
    (1)HotSpot JVM把年輕代分爲了三部分:1個Eden區和2個Survivor區(分別叫from和to)。當Eden沒有足夠空間進行分配,虛擬機將發起一次MInor GC算法

            爲何新生代內存須要有兩個Survivor區?    https://blog.csdn.net/antony9118/article/details/51425581

          a:Survivor的存在乎義,就是減小被送到老年代的對象,進而減小Full GC的發生,Survivor的預篩選保證,只有經歷16次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:

  • Major GC 是清理老年代。
  • Full GC 是清理整個堆空間—包括年輕代和老年代
  • 每次 Minor GC 會清理年輕代的內存
相關文章
相關標籤/搜索