類別載入過程:1、載入階段;2、驗證階段;3、準備階段,主要是將類別變數在方法區進行記憶體分配並進行初始化;4、解析階段;5、初始化階段,編譯器會將類別檔案宣告的靜態賦值變數和靜態區域合併產生cinit方法並進行呼叫;6、使用階段;7、卸載階段。
本教學操作環境:windows7系統、java8版、DELL G3電腦。
瞭解JVM的類別載入過程,主要要回答兩個問題:
1、類別在什麼時候被載入。
2、類別是怎麼載入的。
一、觸發類別載入的條件:
類別的載入過程主要分為七個階段:載入、驗證、準備、解析、初始化、使用、卸載;載入、驗證、準備、初始化、卸載這五個過程順序是確定的,jvm必須嚴格按照這個順序執行,jvm沒有規定類別載入的時機,但卻嚴格規定了五種情況下必須立即對類別進行初始化,載入自然要在此之前。
1、遇到new、getstatic、putstatic、invokestatic這四個指令時,如果類別沒有被初始化,則先對類別進行初始化。
2、使用java.lang.reflect套件的方法對類別進行反射呼叫時,若類別沒有進行初始化,則觸發其初始化。
3、初始化一個類別時假如該類別的父類別沒有進行初始化,首先觸發其父類別的初始化。
4、執行JVM必須指定一個含有main方法的主類,虛擬機會先初始化這個類別。
5、當使用Jdk1.7的動態語言支援時,如果一個java.lang.invoke.MethodHandle實例最後的解析結果REF_getstatic、REF_putstatic、REF_inokestatic的方法句柄,並且這個方法句柄所對應的類別沒有進行初始化時,觸發該類別初始化。
二、類別載入過程
類別載入過程主要分為七個階段:載入、驗證、準備、解析、初始化、使用,解除安裝.
1、載入:
1)、透過一個類別的全限定名稱載入該類別對應的二進位位元組流。主要透過類別載入器實作。
2)、將位元組流所代表的靜態儲存結構轉換為方法區的執行時間資料結構。
3)、在記憶體中產生一個代表這個類別的java.lang.Class對象,作為方法區各個類別存取該類別的入口。 (Hotspot 在方法區產生該類別)。
2、驗證:
1)、檔案格式驗證:驗證類別檔案的魔術版本號常數等是否符合目前虛擬機器支援的範圍。
2)、元資料驗證:驗證類別的語意訊息,是否符合java語言規範的要求。
3)、字節碼驗證:驗證程式語意是合法的、合乎規範的。主要透過stackmapframe結構。
4)、符號引用驗證:虛擬機器在將符號引用轉換為直接引用,驗證符號引用全限定名代表的類別是否能夠找到,對應的域和方法是否能找到,存取權限是否合法。
3、準備:
準備階段主要是將類別變數(被static修飾子修飾)在方法區進行記憶體分配並進行初始化。
資料型別 | 零值 | 資料型別 | 零值 |
---|---|---|---|
#int | 0 | boolean | #false |
long | |||
#long | 0L | float | 0.0f |
#short | 0 | #double | #0.0d |
char | '\u0000' | #reference | #null |
4、解析:
1)、類別或介面解析:將符合參考轉換為類別的直接引用,並檢查存取權限。
2)、欄位解析:將欄位的符號引用轉換為欄位所屬的類別資訊或其父類別該欄位的直接引用,並檢查存取權限。
3)、類別方法解析:將類別方法的符號引用轉換為類別方法所屬的類別資訊或其父類別該欄位的直接引用,並檢查存取權限。
4)、介面方法解析:將介面方法的符號引用轉換為介面方法所屬的介面資訊或其父類別該欄位的直接引用,並檢查存取權限。
5、初始化:
初始化階段編譯器會將類別檔案宣告的靜態賦值變數和靜態區域合併產生
類別載入器:類別載入器是「透過一個類別的全限定名載入這個類別的二進位位元組流」的實現,對於任何一個類,都是由類別載入器和該類別的本身共同確定在虛擬機器中的唯一性。
雙親委派模型:
1、Bootstrap ClassLoader 啟動類別載入器,負責載入
2、Extension ClassLoader 拓展類別載入器,負責載入
3、Application ClassLoader 應用類別載入器,負責載入CLASSPATH路徑下的JAVA類別庫。
4、User ClassLoader 使用者自訂的類別載入器。
雙親委託模型採用這樣的方式載入類別:當類別載入器收到載入類別請求時,首先委託父類別載入該類,所有類別載入器都採用這種方式,因此所有類別載入請求都會到達頂層父類,父類載入不到時再使用該類別載入器中載入。這樣,類別載入器之間就有了一種層級關係,能夠保證Java的基礎類別由相同的類別載入器加載,對Java系統的穩定性起到至關重要的作用。
相關影片教學推薦:Java影片教學
#以上是jvm類別載入過程有哪些階段的詳細內容。更多資訊請關注PHP中文網其他相關文章!