一、載入
1.通過一個類的全限定名來擷取定義此類的二進位位元組流。
2.將這個位元組流所代表的靜態儲存結構轉化為方法區的運行時資料結構。
3.在記憶體中產生一個代表這個類的java.lang.Class對象,作為方法區這個類的各種資料的訪問入口。
二、驗證
1.檔案格式驗證
驗證位元組流是否符合Class檔案格式的規範,並且能被目前的版本的虛擬機器處理。
2.中繼資料驗證
對位元組碼秒數的資訊進行語義分析,以保證其描述的資訊符合java語言規範的要求。
3.位元組碼驗證
通過資料流和控制流程分析,確定程式語義是合法的、符合邏輯的。在第二輪對中繼資料資訊中的資料類型做完校正後,這個階段將對類的方法進行校正分析,保證被校正類的方法在運行時不會做出危害虛擬機器安全的事件。
4.符號引用驗證
對類自身以外(常量池中的各種符號引用)的資訊進行匹配性校正,目的是確保解析動作能夠正常執行,如果無法通過符號引用驗證,將會拋出異常。
三、準備
正式為類變數分配記憶體並設定類變數初始值的階段,這些變數所使用的記憶體都將在方法區中進行分配。
這時候進行記憶體配置的僅包括類變數(被static修飾的變數),而不包括執行個體變數,執行個體變數將會在對象執行個體化時隨對象一起分配到java堆中,還有對類變數的初始化不是將類變數賦值為最終的初始化值,而只是賦值為資料類型的零值。
比如public static int value=123;在準備階段只是將value賦值為int的零值,也就是0,而不是123(程式被編譯之後才會賦值123)
四、解析
解析階段是虛擬機器將常量池內的符號引用替換為直接引用的過程。
符號引用是可以是任意形式的字面量,根據不同的虛擬機器可能不同,但是他們都可以定位到目標,在class檔案中有定義。
直接引用是可以直接指向目標的指標、相對位移量或者一個能間接定位到目標的控制代碼。
五、初始化
到了初始化階段,才開始真正開始執行定義的java程式碼。在該階段,程式員通過程式制定的主觀計划去初始化類變數和其他資源。
真正的賦值在該階段進行,也就是準備階段的public static int value=123; 在該階段value現在將會被賦值為123