jvm類載入的過程:首先執行載入;然後驗證確保Class檔案的位元組流中包含的資訊符合當前虛擬機器的要求;接着準備爲類的靜態變數分配記憶體,初始化爲系統的初始值;最後解析,並初始化。
jvm類載入的過程:
1.載入
載入時jvm做了這三件事:
1)通過一個類的全限定名來獲取該類的二進制位元組流
2)將這個位元組流的靜態儲存結構轉化爲方法區執行時數據結構
3)在記憶體堆中生成一個代表該類的java.lang.Class物件,作爲該類數據的存取入口
2.驗證
驗證、準備、解析這三步可以看做是一個連線的過程,將類的位元組碼連線到JVM的執行狀態之中
驗證是爲了確保Class檔案的位元組流中包含的資訊符合當前虛擬機器的要求,不會威脅到jvm的安全
驗證主要包括以下幾個方面的驗證:
1)檔案格式的驗證,驗證位元組流是否符合Class檔案的規範,是否能被當前版本的虛擬機器處理
2)元數據驗證,對位元組碼描述的資訊進行語意分析,確保符合java語言規範
3)位元組碼驗證 通過數據流和控制流分析,確定語意是合法的,符合邏輯的
4)符號參照驗證 這個校驗在解析階段發生
3.準備,爲類的靜態變數分配記憶體,初始化爲系統的初始值。對於final static修飾的變數,
直接賦值爲使用者的定義值。如下面 下麪的例子:這裏在準備階段過後的初始值爲0,而不是7
public static int a=7
4.解析
解析是將常數池內的符號參照轉爲直接參照(如實體記憶體地址指針)
5.初始化
到了初始化階段,jvm才真正開始執行類中定義的java程式碼
1)初始化階段是執行類構造器<clinit>()方法的過程。類構造器<clinit>()方法是由編譯器自動收集
類中的所有類變數的賦值動作和靜態語句塊(static塊)中的語句合併產生的。
2)當初始化一個類的時候,如果發現其父類別還沒有進行過初始化、則需要先觸發其父類別的初始化。
3)虛擬機器會保證一個類的<clinit>()方法在多執行緒環境中被正確加鎖和同步。
相關學習推薦:
以上就是jvm類載入的過程是什麼的詳細內容,更多請關注php中文網其它相關文章!