JVM 三個代,JAVA8 持久代去哪了?
阿新 • • 發佈:2018-12-31
年輕代(Young Generation)、年老代(Old Generation)和持久代(Permanent
Generation)。其中持久代主要存放的是Java類的類資訊,與垃圾收集要收集的Java物件關係
不大。年輕代和年老代的劃分是對垃 圾收集影響比較大的。
年輕代:
所有新生成的物件首先都是放在年輕代的。年輕代的目標就是儘可能快速的收集掉那些生
命週期短的物件。年輕代分三個區。一個Eden區,兩個 Survivor區(一般而言)。大部分物件在
Eden區中生成。當Eden區滿時,還存活的物件將被複制到Survivor區(兩個中的一個),當這
個 Survivor區滿時,此區的存活物件將被複制到另外一個Survivor區,當這個Survivor去也滿了
的時候,從第一個Survivor區複製過來的並且此時還存活的物件,將被複制“年老區
(Tenured)”。需要注意,Survivor的兩個區是對稱的,沒先後關係,所以同一個區中可能同時
存在從Eden複製過來物件,和從前一個Survivor複製過來的物件,而複製到年老區的只有從第
一個Survivor去過來的物件。而且,Survivor區總有一個是空的。同時,根據程式需要,
Survivor區是可以配置為多個的(多於兩個),這樣可以增加物件在年輕代中的存在時間,減
少被放到年老代的可能。
年老代:
在年輕代中經歷了N次垃圾回收後仍然存活的物件,就會被放到年老代中。因此,可以認
為年老代中存放的都是一些生命週期較長的物件。
持久代:
用於存放靜態檔案,如今Java類、方法等。持久代對垃圾回收沒有顯著影響,但是有些應
用可能動態生成或者呼叫一些class,例如Hibernate 等,在這種時候需要設定一個比較大的持
久代空間來存放這些執行過程中新增的類。持久代大小通過-XX:MaxPermSize=進行設定。
持久代補充:持久帶也稱為方法區
方法區:方法區儲存每一個java類的結構資訊:比如執行時常量池,欄位和方法資料,建構函式和普通方法的位元組碼內容以及類、例項、介面初始化時需要使用到的特殊方法等資料。
方法區也被稱為永久代,如果不顯示指定的話,GC回收的目標僅針對方法區的常量池和型別解除安裝
JDK8中已經把持久代(PermGen Space) 幹掉了,取而代之的元空間(Metaspace)。Metaspace佔用的是本地記憶體,不再佔用虛擬機器記憶體。