1、類載入過程有5步,如圖:
預載入:虛擬機器啟動時載入,載入的是JAVA_HOME/lib/下的rt.jar下的.class檔案;
執行時載入:將用到的類的class物件載入到記憶體中;
2)、驗證:確保Class檔案的位元組流中包含資訊符合當前虛擬機器要求,不會危害虛擬機器自身安全。 主要包括四種驗證,檔案格式驗證,後設資料驗證,位元組碼驗證,符號引用驗證;
3)、準備:為類變數(即static修飾的欄位變數)分配記憶體並且設定該類變數的初始值為0
4)、解析:虛擬機器將常量池內的符號引用替換為直接引用的過程;
符號引用(編譯之後的UTF-8就是符號引用):一組符號來描述目標,可以是任何字面量;
直接引用:直接指向目標的指標、相對偏移量或一個間接定位到目標的控制程式碼。有類或介面的解析,欄位解析,類方法解析,介面方法解析
5)、初始化:給static變數賦值以及執行靜態程式碼塊。
2、類載入器
1)、引導(Bootstrap)類載入器(C++語言實現):主要載入的是JVM自身需要的類,負責將 <JAVA_HOME>/lib路徑下的核心類庫或-Xbootclasspath引數指定的路徑下的jar包載入到記憶體中 只載入包名為java、javax、sun等開頭的類;
2)、擴充套件(Extension)類載入器(Java語言實現、ExtClassLoader類):
用來載入 Java 的擴充套件庫(jre/ext/*.jar); 3)、系統(System)類載入器(也稱應用類載入器、AppClassLoader):
負責載入系統類路徑java -classpath或-D java.class.path 指定路徑下的類庫, 是程式中預設的類載入器, 通過ClassLoader#getSystemClassLoader()方法可以獲取到該類載入器;
4)、自定義類載入器(custom class loader):
通過繼承 java.lang.ClassLoader類的方式實現自己的類載入器,以滿足一些特殊的需求。
3、雙親委派機制:
工作原理如果一個類載入器收到了類載入請求,
它並不會自己先去載入,而是把這個請求委託給父類的載入器去執行,
如果父類載入器還存在其父類載入器,則進一步向上委託,依次遞迴,
請求最終將到達頂層的啟動類載入器,如果父類載入器可以完成類載入任務,就成功返回,
倘若父類載入器無法完成此載入任務,子載入器才會嘗試自己去載入,這就是雙親委派模式。
優缺點:
好處:
1)、Java類隨著它的類載入器一起具備了一種帶有優先順序的層次關係,
通過這種層級關可以避免類的重複載入,當父親已經載入了該類時,就沒有必要子ClassLoader再載入一次;
2)、保證java核心庫的安全性,java核心api中定義型別不會被隨意替換。
覺得不錯,歡迎給一個贊!謝謝!