1. 程式人生 > >Java記憶體管理之Java堆結構是怎麼樣的?裡面有什麼東西?

Java記憶體管理之Java堆結構是怎麼樣的?裡面有什麼東西?

文章目錄


一塊 Java 堆空間一般分成三部分,這三部分用來儲存三類資料:新生代、老年代、永久代。


1. 剛剛建立的物件

在程式碼執行時會持續不斷地創造新的物件,這些新建立的物件會被統一放在一起。因為有很多區域性變數等在新建立後很快會變成 不可達 的物件,快速死去 ,因此這塊區域的特點是 存活物件少,垃圾多 。形象點描述這塊區域為: 新生代;


2. 存活了一段時間的物件

這些物件早早就被建立了,而且一直活了下來。我們把這些 存活時間較長 的物件放在一起,它們的特點是 存活物件多,垃圾少

。形象點描述這塊區域為: 老年代;下面是一些老年代的判斷方式:

  1. 需要大量連續空間的Java物件
  2. 長期存活的物件(預設15次Minor GC後還存活的物件)
  3. 動態物件年齡判斷(在Survivor空間中相同年齡所有物件大小的總和大於Survivor空間的一半,年齡大於或等於該年齡的物件就可以直接進入老年代)

3. 永久存在的物件

比如一些靜態檔案,這些物件的特點是 不需要垃圾回收,永遠存活 。形象點描述這塊區域為:永久代 。(不過在 Java 8 裡已經把 永久代 刪除了,把這塊記憶體空間給了 元空間)