類載入過程:乙個類被載入到虛擬機器的整個生命過程將會經歷,載入、驗證、準備、解析、初始化、使用、解除安裝。這七個階段,其中驗證、準備、解析這三個階段統稱為linking。
類載入時機:
1.使用new 關鍵字例項化物件時。
2.遇j**a.lang.reflect包的方法對型別進行反射呼叫時,如果型別沒有進行初始化,則需先觸發其父類的初始化。
3.初始化類時,如果父類還沒初始化,先初始化父類。
4.當虛擬機器啟動時,使用者需要指定乙個要執行的主類,虛擬機會先初始化這個主類。
5.當使用jdk7新加入的動態語言支援時,如果乙個 j**a.lang.invoke.methodhandle 例項最後的解析結果為 ref_getstatic、 ref_putstatic、ref_invokestatic、ref_newinvokespecial 四種型別的方法句 柄,並且這個方法控制代碼對應的類沒有進行過初始化,則需要先觸發其初始化。
6.當乙個介面中定義了jdk8新加入的預設方法(被default關鍵字修飾的介面方 法)時,如果有這個介面的實現類發生了初始化,那該介面要在其之前被初始化。
類載入器:通過乙個類的全限定名來換取描述該類的二進位製流,這個動作放到j**a虛擬機器外部去實現,以便讓應用程式自己去決定如何去獲取所需的類。
類載入器型別:
根類載入器(bootstrap class loader):用來載入j**a的核心類,由c++實現,不繼承classloader,負責載入jre/lib/rt.jar裡的所有class檔案
擴充套件類載入器(extensions class loader):它負責載入jre的擴充套件目錄jre/ext,由j**a語言實現。
自定義類載入器:通過繼承classloader實現,一般是載入我們的自定義類,由j**a語言實現。
雙親委派機制:
工作過程:當乙個類載入器收到了類載入的請求時,它不會嘗試自己去載入這個類。而是把這個請求委派給父類載入器,每層載入器都是如此,因此所有請求都傳到最頂層啟動類載入器,只有父類載入器無法完成這個請求時,子載入器才會嘗試自己去完成。
打破雙親委派機制場景:
1.第一種被破壞的情況是在雙親委派出現之前,由於雙親委派模型是在jdk1.2之後才被引入的,而在這之前已經有使用者自定義類載入器在用了。
2.是jndi、jdbc等需要載入spi介面實現類的情況。
3.是為了實現熱插拔熱部署工具。為了讓**動態生效而無需重啟,實現方式時把模組連同類載入器一起換掉就實現了**的熱替換。
4.tomcat等web容器的出現。
5.osgi、jigsaw等模組化技術的應用。
深入理解JVM之類載入器 二
在深入理解jvm之類載入器 一 裡面我主要介紹了jvm中關於類的載入相關的一些知識,那在本文我將詳細介紹類的初始過程。我先編寫三個類,如下 public class mytest class myparent class mychild extends myparent 三個類的類名分別為mytes...
JVM 類載入器
載入 驗證 準備 解析 初始化 使用 解除安裝 jvm會在程式使用到某個類的時候通過類載入器將其載入jvm,當然是main方法開始的。驗證,根據j a的虛擬機器規範來校驗載入進來的 class檔案是否符合規範。準備,給類變數等分配一些記憶體空間及初始化值,各種各樣的零 解析,把符號引用替換為直接引用...
JVM 類載入機制 類載入器
類宣告週期 檔案格式驗證 基於二進位製流,只有這一步是基於二進位製流,後續步驟都是基於方法區資料 1.魔數 cafe babe 開頭 2.主次版本是否在當前jvm支援範圍 3.常量池的常量是否不被支援 4.很多很多規範 元資料驗證 1.類是否有父類,object 2.匪類是否繼承了被final修飾的...