1. 程式人生 > >jvm載入class檔案機制j

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程式碼塊。