1. 程式人生 > >新生代進入老年代的方式

新生代進入老年代的方式

  1. 大物件直接進入年老代

    • 大物件即需要大量連續記憶體空間的Java物件,如長字串及陣列。經常出現大物件導致記憶體還有不少空間時就提前觸發垃圾收集以獲取足夠的連續空間來安置他們。 
    • 虛擬機器提供了一個-XX:PretenureSizeThreshold引數,令大於這個設定值的物件直接在老年代分配。 這樣做的目的是避免在Eden區及兩個Survivor區之間發生大量的記憶體複製(新生代採用複製演算法收集記憶體)。
  2. 長期存活的物件將進入年老代

    • 虛擬機器給每個物件定義了一個物件年齡計數器,在物件在Eden建立並經過第一次Minor GC後仍然存活,並能被Suivivor容納的話,將會被移動到Survivor空間,並物件年齡設定為1。每經歷過Minor GC,年齡就增加1歲,當到一定程度(預設15歲,可以通過引數-XXMaxTenuringThreshold設定),就將會晉升年老代。
  3. 動態物件年齡判定

    • 為了更好地適應不同程式記憶體狀況,虛擬機器並不硬性要求物件年齡達到MaxTenuringThreshold才能晉升老年代,如果在Survivor空間中相同年齡所有物件大小的總和大於Survivor空間的一半,年齡大於或等於該年齡的物件就可以直接進入年老