1. 程式人生 > >JVM記憶體分配_---JVM在進行記憶體回收時,是如何識別哪些物件應該放在新生代,哪些物件應該放在老年代的?

JVM記憶體分配_---JVM在進行記憶體回收時,是如何識別哪些物件應該放在新生代,哪些物件應該放在老年代的?

首先,瞭解這一過程,必須對堆的記憶體模型進行了解。先看下圖:
這裡寫圖片描述
JVM將堆記憶體分為新生代(1/3的堆記憶體)和老年代(2/3的堆記憶體)兩個區域。
新生代區域一般採用複製演算法對記憶體進行回收。
老年代區域則採用標記清除演算法和標記壓縮演算法對記憶體進行回收。
JVM為了便於記憶體管理,又將新生代分為3個區域:Eden空間、From空間和To空間,From和To空間也稱為Survivor空間,用來存放沒有被Minor GC 回收的物件。其中from和to空間可以看做用來執行復制演算法操作的兩塊大小相等的記憶體區域(可以互相轉換)。
好了瞭解了堆記憶體的模型之後,來說以下JVM是如何識別新生代和老年代物件的。

首先,JVM為每一個物件定義一個物件年齡計數器。在分配物件時,優先將物件
分配到新生代的Eden空間。當物件經過第一次Minor GC後仍然存活,且能被Survivor(To、From空間)容納的話,就會被移動到Survivor空間中,並將物件年齡設定為1,之後,物件在Survivor區域每經歷過一次Minor GC後,物件年齡計數器就加1,當物件年齡計數器達到15歲(預設年齡,也可通過引數設定)時,如果物件仍然存活,就會晉升為老年代中。

虛擬機器並不是永遠要求物件的年齡達到最大年齡才能晉升到老年代,物件還可以通過另外一種方式晉升到老年代,即如果物件在Survivor空間中,相同年齡的所有物件的記憶體大小大於Survivor空間的一半時(無法執行復制操作了),年齡大於或等於該年齡的物件就可以直接進入老年代。