深入理解Java虛擬機-內存分配與回收策略

1. 內存分配與回收策略

  • MinorGC:指發生在新生代的垃圾收集,MinorGC發生的十分頻繁,回收速率比較快。
  • FullGC:指發生在老年代的垃圾收集,可能會伴隨着至少一次的MinorGC。回收速率較慢。

2. 對象優先在Eden分配

  • 大多數情況下,對象在新生代Eden區域分配 ,當Eden區沒有足夠空間時,將發生一次MinorGC。

3. 大對象直接進入老年代

  • 大對象指需要需要連續的內存空間的Java對象,典型的大對象有很長的字符串和很大的數組。
  • 經常出現的大對象容易導致內存還有不少空間時就要提前觸發垃圾收集來存放大對象
  • 因爲新生代採用的是標記-複製算法,所以這樣做的目的是防止在Eden區和Survivor區的大量內存複製

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

  • 虛擬機爲每個對象定義了一個對象年齡計數器,如果對象從Eden區出生併成功的經過一次MinorGC,並被Survivor容納的話,對象年齡計數器就加1,當對象的年齡增加到一定程度,就進入老年代。

5. 動態對象年齡的判定

  • 如果Survivor區相同年齡的所有對象大小超過Survivor內存區域的一半時,所有大於等於該年齡的對象直接進入老年代。

6. 空間分配擔保

  • 在進行MinorGC之前,虛擬機會檢查老年代最大可用的連續內存空間是否大於新生代所有對象的總空間,如果成立那麼此次MinorGC是安全的。否則,虛擬機會檢查是否允許擔保失敗,如果允許,那麼會繼續檢查老年代最大可用的連續空間是否大於歷次晉升到老年代對象的平均大小。如果大於,將進行一次MinorGC。如果小於或者不允許冒險,將要改爲一次FullGC。
  • 新生代使用的是標記-複製算法,但爲了內存的利用率,只使用一個Survivor空間作爲輪換備份,因此當出現大量對象在MinorGC後仍然存活的情況下,就需要老年代進行內存擔保,把Survivor無法容納的對象直接進入老年代。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章