1. 程式人生 > >java虛擬機器類載入過程(精簡版)

java虛擬機器類載入過程(精簡版)

java虛擬機器類載入過程步驟:

    1.載入

將虛擬機器外部的二進位制位元組流儲存到方法區中:

a.獲取此類二進位制流:

通過一個類的全限定名來獲取定義此類的二進位制流;

b.資料結構轉化:

將位元組流所代表的靜態儲存結構轉化為方法區的執行時資料結構;

c.生成類物件:

在記憶體中生成一個代表這個類的Java.lang.class物件,作為這個類在方法區的各種資料的訪問介面;

2.驗證

確保class檔案位元組流中包含的資訊符合當前虛擬機器的要求,不會危害虛擬機器自身安全;

a.檔案格式驗證:

是否以魔數開頭;

版本號是否在虛擬機器處理範圍內;

常量池中是否有不支援的常量型別;

Class檔案是否被附加其他資訊;......

b.元資料驗證:(對資料型別校驗)

是否有父類;

父類是否能繼承;

類中欄位和方法是否與父類產生矛盾;

c.位元組碼驗證:(對方法體校驗)

通過資料流與控制流分析確定程式語義是合法的;

保證操作棧的資料型別與指令程式碼能配合工作;

保證跳轉指令正確跳轉;

保證方法體中型別轉換有效;

d.符號引用驗證:

確保解析動作能正常執行;

3.準備

為類變數分配記憶體;

設定初始值;

類變數所使用的記憶體在方法區中分配

4.解析

虛擬機器將常量池中的符號引用替換成直接引用;

符號引用(Symbolic References):符號引用以一組符號來描述索引用的目標;

直接引用(Direct References):直接引用可以是直接指向目標的指標、相對偏移量或是一個能間接定位到目標的控制代碼;

主要針對1類或介面,2欄位,3類方法,4介面方法,5方法型別,6方法控制代碼,7呼叫點限定符,7類符號引用進行;

5.初始化

到初始化階段,才開始執行類中定義的Java程式程式碼;

根據程式設計師通過程式制定的主觀計劃去初始化類變數和其它內容;

初始化階段是執行類構造器的過程;