做爲資深IT工程師或架構師,瞭解類在虛擬機中的加載過程是基本功之一。下面來簡單分析一下這個過程,首先看一張總體圖:java
一、加載安全
類的加載是指將類的class文件讀入到內存的過程,併爲之建立一個java.lang.Class對象。網絡
具體流程:數據結構
1.1 經過一個類的全限定名來獲取定義此類的二進制字節流。架構
1.2 將這個字節流所表明的靜態存儲結構轉化爲方法區的運行時數據結構。spa
1.3 在內存中生成一個表明這個類的java.lang.Class對象,做爲方法區這個類的各類數據的訪問入口。對象
二進制數據的來源以下:接口
1.1 從本地系統加載class文件事件
1.2 從JAR包中加載class文件內存
1.3 經過網絡加載class文件
1.4 把一個java源文件動態編譯後再加載
二、鏈接
鏈接階段主要負責把類的二進制數據合併到JRE中,分爲以下三個階段:
2.1 驗證:用於檢驗加載的類是否有正確的內部結構,並和其餘類協調一致,而且不會危害虛擬機自身的安全。
①文件格式驗證:主要是驗證字節流是否符合Class文件格式的規範,而且能被當前版本的虛擬機處理。
②元數據驗證:對字節碼描述的信息進行語義分析,保證其描述的信息符合java語言規範的要求。
③字節碼驗證:經過數據流和控制流分析,肯定程序語義是合法的、符合邏輯的。對類的方法體進行校驗分析,保證被校驗類的方法在運行時不會作出危害虛擬機安全的事件。
④對類自身之外的信息進行匹配性校驗,發生在解析階段。
2.2 準備:負責爲類的變量分配內存並設置類變量初始值。
2.3 解析:將類的二進制數據中的符號引用替換成直接引用。
三、初始化
主要是對類變量進行初始化,對類變量指定初始值有兩種方式:一是聲明類變量時指定,二是使用靜態初始化塊爲類變量指定。
類加載時機:
一、建立類的實例,例如使用new操做符來建立實例
二、調用某個類的類方法
三、訪問某個類或接口的類變量,或爲該類變量賦值。
四、使用反射方式調用。