載入-->驗證-->準備-->解析-->初始化--->使用-->解除安裝
jvm會在程式使用到某個類的時候通過類載入器將其載入jvm,當然是main方法開始的。
驗證,根據j**a的虛擬機器規範來校驗載入進來的 .class檔案是否符合規範。
準備,給類變數等分配一些記憶體空間及初始化值,各種各樣的零
解析,把符號引用替換為直接引用
初始化,執行靜態**塊、準備階段變數的初始值將附上應有的值。載入乙個類的時候必須要先載入並初始化他的父類。
類載入器是通過類的全限定名(或者說絕對路徑)來找到乙個class檔案的。巨集觀來看,只有兩種類載入器:啟動類載入器、其他類載入器。啟動類載入器屬於虛擬機器的一部分,它是用c++寫的,看不到原始碼;其他類載入器是用j**a寫的,說白了就是一些j**a類,比如擴充套件類載入器、應用類載入器。不同的類庫可能是被不同的類載入器載入的。
類載入器是有層級結構的,第一層是啟動類載入器,第二層是擴充套件類載入器,第三層是應用程式類載入器,最後是自定義類載入器。可以看作父子關係
啟動類載入器:bootstrap classload,用於載入jdk的lib目錄下的核心類庫。
擴充套件類載入器:extension classload,用於載入lib\ext目錄下的類庫。
自定義類載入器:可以自己編寫類載入器,根據需求載入自己的類。
自己寫的類一般都是由應用程式類載入器載入的,他拿到這個類不會馬上就載入,會給自己的上一級擴充套件類載入器,而擴充套件類載入器也不會馬上載入,會再給自己的上級啟動類載入器。當啟動類載入器在自己負責載入的範圍內沒有找到這個類時就會再給自己的下一級擴充套件類載入器去載入,這是擴充套件類載入器就會看自己負責的範圍內有沒有這個類,如果沒有就再給他的下級應用程式類載入器去載入,應用程式類載入器找到了就會去載入了。
確保類的全域性唯一性。
如果你自己寫的乙個類與核心類庫中的類重名,會發現這個類可以被正常編譯,但永遠無法被載入執行。因為你寫的這個類不會被應用類載入器載入,而是被委託到頂層,被啟動類載入器在核心類庫中找到了。如果沒有雙親委託機制來確保類的全域性唯一性,誰都可以編寫乙個j**a.lang.object類放在classpath下,那應用程式就亂套了。從安全的角度講,通過雙親委託機制,j**a虛擬機器總是先從最可信的j**a核心api查詢型別,可以防止不可信的類假扮被信任的類對系統造成危害。
JVM 類載入機制 類載入器
類宣告週期 檔案格式驗證 基於二進位製流,只有這一步是基於二進位製流,後續步驟都是基於方法區資料 1.魔數 cafe babe 開頭 2.主次版本是否在當前jvm支援範圍 3.常量池的常量是否不被支援 4.很多很多規範 元資料驗證 1.類是否有父類,object 2.匪類是否繼承了被final修飾的...
JVM類載入機制 類載入器
一 概念 通過乙個類的全限定名來獲取描述此類的二進位制位元組流 實現這個動作的 模組成為 類載入器。4 雙親委派模型 1 定義 除了頂層的啟動類載入器外,其餘的類載入器都應當有自己的父類載入器,且載入器之間的父子關係一般不會繼承,而是使用組合關係來復用父載入器的 2 工作過程 如果乙個類載入器收到了...
JVM 類載入機制
1 載入步驟 jvm 類載入機制分為五個部分 載入,驗證,準備,解析,初始化。2 類載入器 3 雙親委派 1 什麼是雙親委派?當乙個類收到了類載入請求,他首先把這個請求委派給父類去完成,每乙個層次類載入器都是如此,因此所有的載入請求都應該傳送到啟動類載入其中,只有當父類載入器反饋自己無法完成這個請求...