虛擬機類加載機制

 

虛擬機類加載機制:把描述類的數據從class文件加載到內存,並對數據進行校驗、轉換解析和初始化,最終形成可以被虛擬機直接使用的Java類型。在Java語言裏面,類型的加載、連接和初始化都是在程序運行期間完成的。

 

類加載的時機

類的整個生命週期包括:加載(loading)、驗證(verification)、準備(preparation)、解析(resolution)、初始化(initialization)、使用(using)和卸載(unloading7個階段。其中 驗證、準備、解析 3個部分統稱連接(linking

5種必須立即初始化的情況:

1.遇到new, getstatic, putstatic 或 invokestatic 4挑字節碼指令;

2.使用 java.lang.reflect 包的方法對類進行反射調用;

3.初始化一個類的時候,其父類還沒有初始化,必須先觸發其父類的初始化;(對於接口,只有在真正用到其父接口的時候纔會初始化)

4.虛擬機啓動時,用戶指定要執行的主類;

5.當使用 JDK 1.7 的動態語言支持時,如果一個 java.lang.invoke.MethodHandle 實例最後的解析結果 REF_getStatic, REF_putStatic, REF_invokeStatic 的方法句柄,並且這個方法句柄鎖對應的類沒有進行初始化,則需要先觸發其初始化。對於靜態字段,只有直接定義這個字段的類纔會被初始化。

 

類加載過程

在加載階段,虛擬機需要完成以下3件事:

1.通過一個類的全限定名來獲取定義此類的二進制字節流

2.將這個字節流所代表的靜態存儲結構轉化爲方法區的運行時數據結構

3.在內存中生成一個代表這個類的 java.lang.Class 對象 ,作爲方法區這個類的各種數據的訪問入口。

驗證階段大致上會完成下面4個階段的校驗動作:文件格式驗證、元數據驗證、字節碼驗證、符號引用驗證。

準備階段正式爲類變量分配內存並設置類變量初始值。如果類變量是非常量的,那麼這個初始值一般是零值,常量則根據class文件的裏的ConstantValue設置爲目標值。

解析階段是將常量池內的符號引用轉換爲直接引用的過程。符號引用(Symbolic References):符號引用以一組符號來描述所引用的目標,符號可以是任何形式的字面量,只要使用時能無歧義地定位到目標即可。符號引用與虛擬機的內存佈局無關。 直接引用(Direct Reference):直接引用可以是直接指向目標的指針、相對偏移量或是一個能間接定位到目標的句柄。直接引用與虛擬機的內存佈局有關。如果有了直接引用,引用的目標必定已在內存中。

 

初始化階段是類加載的最後一步,到此階段才真正開始執行類定義中的java程序代碼。(執行類構造器 <clinit>() 方法).<clinit>() 方法是由編譯器自動收集類中所有的類變量的賦值動作和靜態語句塊( static{})中的語句合併產生,收集的順序由語句在源文件中出現的順序決定,靜態語句塊中只能訪問到定義在靜態語句塊之前的變量,定義在它之後的變量,可以賦值,但不能訪問。

 

類加載器

類加載器用於完成“通過一個類的全限定名來獲取描述此類的二進制字節流”。任何一個類,都需要由加載它的類加載器和這個類本身來確立其在JVM中的唯一性,每個類加載器都擁有一個獨立的類名稱空間。從JVM的角度,只存在兩種不同的類加載器:

1.啓動類加載器(Bootstrap ClassLoader),JVM的一部分

2.其他所有的類加載器,用Java語言實現,獨立於JVM,全部繼承自 java.lang.ClassLoader

 

從開發人員角度,程序會使用到3中系統提供的類加載器:

1.啓動類加載器(Bootstrap ClassLoader):負責加載存放在 <JAVA_HOME>\lib 目錄中的,或者被 -Xbootclasspath 參數所指定的路徑中的,且是虛擬機識別的(僅安裝文件名識別,如 rt.jar)類庫

2.擴展類加載器(Extension ClassLoader):負責加載 <JAVA_HOME>\lib\ext 目錄中下、或者被 java.ext.dirs 系統變量制定的路徑下的所有類庫

3.應用程序類加載器(Application ClassLoader):這個類加載器也稱爲系統類加載器,負責加載用戶類路徑上所指定的類庫

雙親委派模型要求除了啓動類加載器之外,其餘的類加載器都應當有自己的父類加載器,這種父子關係一般用組合實現:一個類加載器收到類加載請求時,首先委託給父類去加載,父類又遞歸地委託給自己的父類去加載,只有在父類無法加載時才自己嘗試去加載。雙親委派模型不是強制的,只是建議。適當地不遵守雙親委派模型可以實現一些特殊的類加載需求,比如熱部署。

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章