1. 程式人生 > >JVM中新生代、老年代與永久代的理解

JVM中新生代、老年代與永久代的理解

新生代、老年代、永久代

  • 一般把java堆分為新生代、老年代,這樣就可以根據各個年代的特點採用最適當的收集演算法。新生代中,每次垃圾收集時都發現大批物件死去,只有少量物件存活,便採用了複製演算法,只需要付出少量存活物件的複製成本就可以完成收集。而老年代中因為物件存活率高、沒有額外空間對它進行分配擔保,就必須採用“標記-清理”或者“標記-整理”演算法,新生代又分為Eden和Survivor(From Space與To Space)兩個區。加上老年代就這三個區。資料會首先分配到Eden區當中(當然也有特殊情況,如果是大物件那麼會直接放入到老年代(大物件是指需要大量連續記憶體空間的java物件)。當Eden沒有足夠空間的時候就會觸發jvm發起一次Minor GC。如果物件經過一次Minor-GC還存活,並且又能被Survivor空間接受,那麼將被移動到Survivor空間當中。並將其年齡設為1,物件在Survivor每熬過一次Minor GC,年齡就加1,當年齡達到一定的程度(預設為15)時,就會被晉升到老年代中了,當然晉升老年代的年齡是可以設定的。
  • JVM的方法區,也被稱為永久代。在這裡都是放著一些被虛擬機器載入的類資訊,靜態變數,常量等資料。這個區中的東西比老年代和新生代更不容易回收。
  • 其實新生代和老年代就是針對於物件做分割槽儲存,更便於回收等等。

Minor GC ,Full GC 觸發條件

Minor GC觸發條件:

當Eden區滿時,觸發Minor GC。

Full GC觸發條件:

(1)呼叫System.gc時,系統建議執行Full GC,但是不必然執行

(2)老年代空間不足

(3)方法區空間不足

(4)通過Minor GC後進入老年代的平均大小大於老年代的可用記憶體

(5)由Eden區、From Space區向To Space區複製時,物件大小大於To Space可用記憶體,則把該物件轉存到老年代,且老年代的可用記憶體小於該物件大小