本文原始碼:GitHub·點這里 || GitEE·點這里
一、類加載簡介
類的加載機制是指把編譯后的.class類檔案的二進制資料讀取到記憶體中,并為之創建一個java.lang.Class物件,用來封裝類在元資料空間的資料結構,

類在JVM中的生命周期為:加載,連接,初始化,使用,卸載,不過這里只重點描述加載,連接,初始化這三個程序,
二、加載程序
基于一張圖看類加載子系統的細節流程:

1、加載階段
程序描述
加載階段需要完成以下三個程序:
- 通過類的全限定名來獲取其定義的二進制位元組流;
- 將位元組流所代表的靜態存盤結構轉化為云資料空間的運行時資料結構;
- 在堆Heap中生成一個代表這個類的java.lang.Class物件,作為對元資料空間中這些資料的訪問入口;
類加載器
- 引導類加載器
Bootstrap-ClassLoader基于C/C++實作,負責加載Java的核心類別庫JAVA_HOME\jre\lib\rt.jar,該加載器不繼承自ClassLoader抽象類,并且只加載包名為java、javax、sun等開頭類,一次保證對核心原始碼的保護,
- 擴展類加載器
Extension-ClassLoader,基于Java語言,由sun.misc.Launcher$ExtClassLoader實作,派生于ClassLoader抽象類,從java.ext.dirs系統變數指定的路徑中的加載類別庫,或者JDK安裝目錄jre\lib\ext目錄下加載,
- 系統類加載器
Application-ClassLoader,基于Java語言,由sun.misc.Launcher$ExtClassLoader實作,它負責加載環境變數ClassPath指定的類別庫,如果在應用程式中沒有自定義類加載器,一般情況下作為程式中默認的類加載器,
2、連接階段
驗證
目的在于確保Class檔案的位元組流中包含的資訊符合當前虛擬機的要求,保證加載類的正確性,不會危害虛擬機自身的安全,主要包括四種檢驗動作:
- 檔案格式驗證:驗證位元組流是否符合Class檔案格式的規范;
- 元資料驗證:確保其描述的資訊符合Java語言規范的要求;
- 位元組碼驗證:確定程式語意是符合邏輯的;
- 符號參考驗證:確保決議動作能正確執行,
準備
為類的靜態變數分配記憶體,并初始化為默認值,這時候進行記憶體分配的僅包括類變數(static)修飾,不包括(final-static)修飾的,這里也不會為實體變數分配初始化,實體變數會隨著物件一塊分配到Java堆中,
決議
將常量池中的符號參考轉換為直接參考的程序,直接參考就是直接指向目標的指標、相對偏移量或一個間接定位到目標的句柄,決議主要針對類或介面、欄位、類方法、介面方法、方法型別等,決議的動作實際是會隨著JVM在執行完初始化之后再執行的,
3、初始化階段
執行類構造器clinit()方法的程序,該方法不需要自定義,是javac編譯器自動收集類中的所有類變數的賦值動作和靜態代碼塊中的陳述句合并而來,Jvm要保證clinit()方法在多執行緒訪問下的安全性,
三、機制策略
1、雙親委派模式

類加載器收到了類加載的請求時,不會自己先去嘗試加載這個類,而是把請求委托給父加載器去執行;
如果父加載器還存在父類加載器,則依次向上委托,因此類加載請求最終都應該被傳遞到頂層的啟動類加載器中;
如果父類加載器可以完成類加載請求,就直接成功回傳,只有當父加載器在無法完成該加載,子加載器才會嘗試自己去加載該類;
2、沙箱安全機制
假設自定義一個類名為String且所在包為java.lang,在使用引導類加載器加載時會先加載JDK中的String類,因為這個類本來是屬于jdk的,后面再次出現String類就會報錯,以此保證源代碼不被惡意篡改,這就是沙箱安全機制,
四、源代碼地址
GitHub·地址
https://github.com/cicadasmile/java-base-parent
GitEE·地址
https://gitee.com/cicadasmile/java-base-parent
推薦閱讀:編程體系整理
| 序號 | 專案名稱 | GitHub地址 | GitEE地址 | 推薦指數 |
|---|---|---|---|---|
| 01 | Java描述設計模式,演算法,資料結構 | GitHub·點這里 | GitEE·點這里 | ☆☆☆☆☆ |
| 02 | Java基礎、并發、面向物件、Web開發 | GitHub·點這里 | GitEE·點這里 | ☆☆☆☆ |
| 03 | SpringCloud微服務基礎組件案例詳解 | GitHub·點這里 | GitEE·點這里 | ☆☆☆ |
| 04 | SpringCloud微服務架構實戰綜合案例 | GitHub·點這里 | GitEE·點這里 | ☆☆☆☆☆ |
| 05 | SpringBoot框架基礎應用入門到進階 | GitHub·點這里 | GitEE·點這里 | ☆☆☆☆ |
| 06 | SpringBoot框架整合開發常用中間件 | GitHub·點這里 | GitEE·點這里 | ☆☆☆☆☆ |
| 07 | 資料管理、分布式、架構設計基礎案例 | GitHub·點這里 | GitEE·點這里 | ☆☆☆☆☆ |
| 08 | 大資料系列、存盤、組件、計算等框架 | GitHub·點這里 | GitEE·點這里 | ☆☆☆☆☆ |
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/104945.html
標籤:Java
