2015-06-15 33 views

回答

7

警告:正如@assylias所述,此機制特定於Oracle HotSpot JVM。

Java8

之前所有的元信息都存儲在PermGen的,對於抽象類和接口。元信息僅包括特定於類的信息(它具有哪些字段,什麼是父類等)。

接口只能有public static final字段,所以這個字段元信息存儲在PermGen中。

抽象類可以同時具有靜態和非靜態字段。然而,在元信息方面沒有區別,所以它們都存儲在PermGen中。另一方面,真實對象實例存儲在Heap中的靜態和非靜態字段。

參見例如約calendarmyDate存儲在PermGen的和真實對象實例被存儲在堆

public class MyClass { 
    public static final Calendar calendar = Calendar.getInstance(); 
    private Date myDate = new Date(); 
} 

字段信息。

Java8 PermGen被移動到堆空間中,在所謂的Metaspace中,所以您不會再看到java.lang.OutOfMemoryError: PermGen space。然而,元信息和對象分配內存之間的概念分離仍然存在。

也審查@AlexTaylor規格報價。

+0

正如所評論的,這是依賴於JVM的 - 例如,您所說的對於hostpot/Java 8來說是不正確的,因爲根本不再有Permgen ... – assylias

+0

This仍然是特定於熱點JVM的。 – assylias

6

method area的(邏輯堆的一部分)存儲關於在JVM中的類和接口大量的信息:

...存儲每個類結構,如運行時的常量池,場 和方法數據,以及方法和構造函數的代碼,包括 用於類和實例初始化的特殊方法(§2.9) 和接口初始化。

但是:

該規範並不強制方法區或 用於管理編譯的代碼策略的位置。

這意味着特定的JVM可以隨意存儲它們,無論它在哪裏。

相關問題