標籤:java記憶體 void sync inter 描述 唯一性 tle info const
方法區(Method Area)
① 對每個載入的類型,JVM必須在方法區中儲存以下類資訊:
1) 這個類型的完整有效名(類型資訊)
類型名稱在Java類檔案和JVM中都以完整有效名出現。在java原始碼中,完整有效名由類的所屬包名稱加一個".",再加上類名組成。例如,類Object的所屬包為java.lang,那它的完整有效名為java.lang.Object,但在類檔案裡,所有的"."都被斜杠“/”代替,就成為java/lang/Object。完整有效名在方法區中的表示根據不同的實現而不同。
2) 這個類型直接父類的完整有效名(除非這個類型是interface或是 java.lang.Object,兩種情況下都沒有父類
3) 這個類型的修飾符(Public,Abstract, Final的某個子集)
4) 這個類型直接介面的一個有序列表
② 除了以上的基本資料外,JVM還要為每個類型儲存以下資訊:
1) 類型的常量池(Constant Pool)
JVM為每個已載入的類型都維護一個常量池。
常量池就是這個類型用到的常量的一個有序集合,包括實際的常量/字面量(String,Integer和Floating Point浮點常量)和對類型,域和方法的符號引用。池中的資料項目象數組項一樣,是通過索引訪問的。 因為常量池儲存了一個類型所使用到的所有類型,域和方法的符號引用
字面量:是用於表達原始碼中一個固定值的標記法(如文本字串,聲明為final的常量值等)
常量: (被聲明為final的類變數)每個常量都會在常量池中有一個拷貝。non-final類變數被儲存在聲明它的類資訊內,而final類被儲存在所有使用它的類資訊內。
符號引用:(符號引用以一組符號來描述所引用的目標,符號可以是任何形式的字面量,只要使用時能夠無歧義的定位到目標即可—保證唯一性)類和介面的全限定名、 欄位的名稱和描述符、方法的名稱和描述符。符號引用與虛擬機器的記憶體布局無關,引用的目標並不一定載入到記憶體中。在Java中,一個java類將會編譯成一個class檔案。在編譯時間,java類並不知道所引用的類的實際地址,因此只能使用符號引用來代替。(類似於CONSTANT_Class_info的常量來表示的)
常量池在Java程式的動態連結(運行期間也可能將新的常量放入池中)中起了核心的作用。
2) 域(Field)資訊 (欄位資訊)
JVM必須在方法區中檔案類型的所有域的相關資訊以及域的聲明順序, 域的相關資訊包括: 網域名稱 、域類型 、域修飾符(public,private, protected,static,final,volatile,transient的某個子集)
域:域是一種屬性,可以是一個類變數(類的靜態變數),一個物件變數,一個對象方法變數或者是一個函數的參數
3) 方法資訊
JVM必須儲存所有方法的一下資訊,同域資訊一樣包含聲明順序,方法名、方法返回的類型(也可以是void)、方法參數的數量和類型(有序的)、方法的修飾符(public, private, protected, static, final, synchronized, native, abstract的一個子集)除了abstract和native方法外,其他方法還有儲存方法的位元組碼(bytecodes)、運算元棧和方法棧幀的局部變數區的大小、異常表
4) 類變數(除了常量外的所有靜態(static)變數)
類變數(類的靜態變數)被類的所有執行個體共用,即使沒有類執行個體時你也可以訪問它。這些變數只與類相關,所以在方法區中,它們成為類資料在邏輯上的一部分。在jvm使用一個類之前,它必須在方法區中為每個non-final類變數分配空間。
5) 指向類載入器的引用
每一個被JVM載入的類型,都儲存這個類載入器的引用,類載入器動態連結時會用到。
Java記憶體模型——方法區