jvm載入class檔案機制j
1、載入類檔案
a、讀取class檔案,從jar包、war包、class檔案、jsp檔案等處都可以。
a.1、採用雙親委派機制載入類,由classLoader和其子類完成,支援自定義ClassLoader。
如下圖,由下至上,當一個類載入器收到類載入任務,會先交給其父類載入器去完成,
因此最終載入任務都會傳遞到 頂層的啟動類載入器,只有當父類載入器無法完成載入任務時,才會嘗試執行載入任 務。
好處是比如載入位於rt.jar包中的類java.lang.Object,不管是哪個載入器載入這個類,最終都是委託給頂層的啟動類 載入器進行載入,這樣就保證了使用不同的類載入器最終得到的都是同樣一個Object物件。
bootstrap ClassLoader 啟動類載入器 載入JAVA_HOME/lib下的jar包
extension ClassLoader 擴充套件類載入器 載入JAVA_HOME/lib/ext目錄下的jar
application ClassLoader 應用程式類載入器,載入使用者自己的class檔案 jar包等
b、生成一個java.lang.Class物件,作為方法區的該類的變數入口。
2、連線
2.1、驗證,驗證class檔案的位元組流是不是符合jvm規範,避免jvm被破壞。
2.2、準備,為類的變數分配記憶體,並設定初始值,簡單來說就是為變數分配空間,這裡需注意:此時設定初始值並不是變數 的真實值。
比如:public
static
int
a =
123
;本階段賦值是0而不是123
final修飾的屬性除外,public
static final
int
a =
123
;會將a設定成ConstantValue屬性,並賦真實值123.
2.3、解析,將常量池中的符號引用替換為直接引用。
3、初始化,本階段是jvm給類中的變數賦值和執行static程式碼塊。