D2W28資訊網——每日最新資訊28at.com
圖片D2W28資訊網——每日最新資訊28at.com
一. 什么是類加載器,類加載器有哪些?
要想理解類加載器的話,務必要先清楚對于一個Java文件,它從編譯到執行的整個過程。D2W28資訊網——每日最新資訊28at.com
圖片D2W28資訊網——每日最新資訊28at.com
- 類加載器:用于裝載字節碼文件(.class文件)
- 運行時數據區:用于分配存儲空間
- 執行引擎:執行字節碼文件或本地方法
- 垃圾回收器:用于對JVM中的垃圾內容進行回收
1.1. 類加載器
JVM只會運行二進制文件,而類加載器(ClassLoader)的主要作用就是將字節碼文件加載到JVM中,從而讓Java程序能夠啟動起來。現有的類加載器基本上都是java.lang.ClassLoader的子類,該類的只要職責就是用于將指定的類找到或生成對應的字節碼文件,同時類加載器還會負責加載程序所需要的資源D2W28資訊網——每日最新資訊28at.com
1.2. 類加載器種類
類加載器根據各自加載范圍的不同,劃分為四種類加載器:D2W28資訊網——每日最新資訊28at.com
- 啟動類加載器(BootStrap ClassLoader):該類并不繼承ClassLoader類,其是由C++編寫實現。用于加載JAVA_HOME/jre/lib目錄下的類庫。
- 擴展類加載器(ExtClassLoader):該類是ClassLoader的子類,主要加載JAVA_HOME/jre/lib/ext目錄中的類庫。
- 應用類加載器(AppClassLoader):該類是ClassLoader的子類,主要用于加載classPath下的類,也就是加載開發者自己編寫的Java類。
- 自定義類加載器:開發者自定義類繼承ClassLoader,實現自定義類加載規則。
上述三種類加載器的層次結構如下如下:D2W28資訊網——每日最新資訊28at.com
圖片D2W28資訊網——每日最新資訊28at.com
類加載器的體系并不是“繼承”體系,而是委派體系,類加載器首先會到自己的parent中查找類或者資源,如果找不到才會到自己本地查找。類加載器的委托行為動機是為了避免相同的類被加載多次。D2W28資訊網——每日最新資訊28at.com
二. 什么是雙親委派模型?
如果一個類加載器在接到加載類的請求時,它首先不會自己嘗試去加載這個類,而是把這個請求任務委托給父類加載器去完成,依次遞歸,如果父類加載器可以完成類加載任務,就返回成功;只有父類加載器無法完成此加載任務時,才由下一級去加載。D2W28資訊網——每日最新資訊28at.com
圖片D2W28資訊網——每日最新資訊28at.com
三. JVM為什么采用雙親委派機制
- 通過雙親委派機制可以避免某一個類被重復加載,當父類已經加載后則無需重復加載,保證唯一性。
- 為了安全,保證類庫API不會被修改
在工程中新建java.lang包,接著在該包下新建String類,并定義main函數D2W28資訊網——每日最新資訊28at.com
public class String { public static void main(String[] args) { System.out.println("demo info"); }}
此時執行main函數,會出現異常,在類 java.lang.String 中找不到 main 方法D2W28資訊網——每日最新資訊28at.com
圖片D2W28資訊網——每日最新資訊28at.com
出現該信息是因為由雙親委派的機制,java.lang.String的在啟動類加載器(Bootstrap classLoader)得到加載,因為在核心jre庫中有其相同名字的類文件,但該類中并沒有main方法。這樣就能防止惡意篡改核心API庫。D2W28資訊網——每日最新資訊28at.com
四. 類裝載的執行過程?
類從加載到虛擬機中開始,直到卸載為止,它的整個生命周期包括了:加載、驗證、準備、解析、初始化、使用和卸載這7個階段。其中,驗證、準備和解析這三個部分統稱為連接(linking)。D2W28資訊網——每日最新資訊28at.com
圖片D2W28資訊網——每日最新資訊28at.com
類加載過程詳解
1.加載
圖片D2W28資訊網——每日最新資訊28at.com
- 通過類的全名,獲取類的二進制數據流。
- 解析類的二進制數據流為方法區內的數據結構(Java類模型)
- 創建java.lang.Class類的實例,表示該類型。作為方法區這個類的各種數據的訪問入口
圖片D2W28資訊網——每日最新資訊28at.com
2.驗證
圖片D2W28資訊網——每日最新資訊28at.com
驗證類是否符合JVM規范,安全性檢查D2W28資訊網——每日最新資訊28at.com
(1)文件格式驗證:是否符合Class文件的規范D2W28資訊網——每日最新資訊28at.com
(2)元數據驗證D2W28資訊網——每日最新資訊28at.com
- 這個類是否有父類(除了Object這個類之外,其余的類都應該有父類)
- 這個類是否繼承(extends)了被final修飾過的類(被final修飾過的類表示類不能被繼承)
- 類中的字段、方法是否與父類產生矛盾。(被final修飾過的方法或字段是不能覆蓋的)
(3)字節碼驗證- 主要的目的是通過對數據流和控制流的分析,確定程序語義是合法的、符合邏輯的。D2W28資訊網——每日最新資訊28at.com
(4)符號引用驗證:符號引用以一組符號來描述所引用的目標,符號可以是任何形式的字面量D2W28資訊網——每日最新資訊28at.com
比如:int i = 3; 字面量:3 符號引用:iD2W28資訊網——每日最新資訊28at.com
3.準備
圖片D2W28資訊網——每日最新資訊28at.com
為類變量分配內存并設置類變量初始值
- static變量,分配空間在準備階段完成(設置默認值),賦值在初始化階段完成
- static變量是final的基本類型,以及字符串常量,值已確定,賦值在準備階段完成
- static變量是final的引用類型,那么賦值也會在初始化階段完成
圖片D2W28資訊網——每日最新資訊28at.com
4.解析
圖片D2W28資訊網——每日最新資訊28at.com
把類中的符號引用轉換為直接引用
比如:方法中調用了其他方法,方法名可以理解為符號引用,而直接引用就是使用指針直接指向方法。D2W28資訊網——每日最新資訊28at.com
圖片D2W28資訊網——每日最新資訊28at.com
5.初始化
圖片D2W28資訊網——每日最新資訊28at.com
對類的靜態變量,靜態代碼塊執行初始化操作D2W28資訊網——每日最新資訊28at.com
- 如果初始化一個類的時候,其父類尚未初始化,則優先初始化其父類。
- 如果同時包含多個靜態變量和靜態代碼塊,則按照自上而下的順序依次執行。
6.使用
圖片D2W28資訊網——每日最新資訊28at.com
JVM 開始從入口方法開始執行用戶的程序代碼D2W28資訊網——每日最新資訊28at.com
- 調用靜態類成員信息(比如:靜態字段、靜態方法)
- 使用new關鍵字為其創建對象實例
7.卸載
當用戶程序代碼執行完畢后,JVM 便開始銷毀創建的 Class 對象,最后負責運行的 JVM 也退出內存D2W28資訊網——每日最新資訊28at.com
五.類加載器面試
面試官:什么是類加載器,類加載器有哪些?D2W28資訊網——每日最新資訊28at.com
候選人:D2W28資訊網——每日最新資訊28at.com
JVM只會運行二進制文件,而類加載器(ClassLoader)的主要作用就是將字節碼文件加載到JVM中,從而讓Java程序能夠啟動起來。D2W28資訊網——每日最新資訊28at.com
常見的類加載器有4個D2W28資訊網——每日最新資訊28at.com
第一個是**啟動類加載器(BootStrap ClassLoader)**:其是由C++編寫實現。用于加載JAVA_HOME/jre/lib目錄下的類庫。D2W28資訊網——每日最新資訊28at.com
第二個是**擴展類加載器(ExtClassLoader)**:該類是ClassLoader的子類,主要加載JAVA_HOME/jre/lib/ext目錄中的類庫。D2W28資訊網——每日最新資訊28at.com
第三個是**應用類加載器(AppClassLoader)**:該類是ClassLoader的子類,主要用于加載classPath下的類,也就是加載開發者自己編寫的Java類。D2W28資訊網——每日最新資訊28at.com
第四個是自定義類加載器:開發者自定義類繼承ClassLoader,實現自定義類加載規則。D2W28資訊網——每日最新資訊28at.com
面試官:說一下類裝載的執行過程?D2W28資訊網——每日最新資訊28at.com
候選人:D2W28資訊網——每日最新資訊28at.com
類從加載到虛擬機中開始,直到卸載為止,它的整個生命周期包括了:加載、驗證、準備、解析、初始化、使用和卸載這7個階段。其中,驗證、準備和解析這三個部分統稱為連接(linking)D2W28資訊網——每日最新資訊28at.com
1.加載:查找和導入class文件D2W28資訊網——每日最新資訊28at.com
2.驗證:保證加載類的準確性D2W28資訊網——每日最新資訊28at.com
3.準備:為類變量分配內存并設置類變量初始值D2W28資訊網——每日最新資訊28at.com
4.解析:把類中的符號引用轉換為直接引用D2W28資訊網——每日最新資訊28at.com
5.初始化:對類的靜態變量,靜態代碼塊執行初始化操作D2W28資訊網——每日最新資訊28at.com
6.使用:JVM 開始從入口方法開始執行用戶的程序代碼D2W28資訊網——每日最新資訊28at.com
7.卸載:當用戶程序代碼執行完畢后,JVM 便開始銷毀創建的 Class 對象,最后負責運行的 JVM 也退出內存D2W28資訊網——每日最新資訊28at.com
面試官:什么是雙親委派模型?D2W28資訊網——每日最新資訊28at.com
候選人:D2W28資訊網——每日最新資訊28at.com
如果一個類加載器收到了類加載的請求,它首先不會自己嘗試加載這個類,而是把這請求委派給父類加載器去完成,每一個層次的類加載器都是如此,因此所有的加載請求最終都應該傳說到頂層的啟動類加載器中,只有當父類加載器返回自己無法完成這個加載請求(它的搜索返回中沒有找到所需的類)時,子類加載器才會嘗試自己去加載D2W28資訊網——每日最新資訊28at.com
面試官:JVM為什么采用雙親委派機制D2W28資訊網——每日最新資訊28at.com
候選人:D2W28資訊網——每日最新資訊28at.com
主要有兩個原因。D2W28資訊網——每日最新資訊28at.com
第一、通過雙親委派機制可以避免某一個類被重復加載,當父類已經加載后則無需重復加載,保證唯一性。D2W28資訊網——每日最新資訊28at.com
第二、為了安全,保證類庫API不會被修改D2W28資訊網——每日最新資訊28at.com
本文鏈接:http://www.www897cc.com/showinfo-26-38750-0.html什么是類加載器?什么是雙親委派模型?
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 幾款熱門容器化編排工具對比
下一篇: Python中不起眼但是很實用的help函數