日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

什么是類加載器?什么是雙親委派模型?

來源: 責(zé)編: 時間:2023-12-06 17:13:34 356觀看
導(dǎo)讀圖片一. 什么是類加載器,類加載器有哪些?要想理解類加載器的話,務(wù)必要先清楚對于一個Java文件,它從編譯到執(zhí)行的整個過程。圖片類加載器:用于裝載字節(jié)碼文件(.class文件)運(yùn)行時數(shù)據(jù)區(qū):用于分配存儲空間執(zhí)行引擎:執(zhí)行字節(jié)碼

SDm28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片SDm28資訊網(wǎng)——每日最新資訊28at.com

一. 什么是類加載器,類加載器有哪些?

要想理解類加載器的話,務(wù)必要先清楚對于一個Java文件,它從編譯到執(zhí)行的整個過程。SDm28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片SDm28資訊網(wǎng)——每日最新資訊28at.com

  • 類加載器:用于裝載字節(jié)碼文件(.class文件)
  • 運(yùn)行時數(shù)據(jù)區(qū):用于分配存儲空間
  • 執(zhí)行引擎:執(zhí)行字節(jié)碼文件或本地方法
  • 垃圾回收器:用于對JVM中的垃圾內(nèi)容進(jìn)行回收

1.1. 類加載器

JVM只會運(yùn)行二進(jìn)制文件,而類加載器(ClassLoader)的主要作用就是將字節(jié)碼文件加載到JVM中,從而讓Java程序能夠啟動起來。現(xiàn)有的類加載器基本上都是java.lang.ClassLoader的子類,該類的只要職責(zé)就是用于將指定的類找到或生成對應(yīng)的字節(jié)碼文件,同時類加載器還會負(fù)責(zé)加載程序所需要的資源SDm28資訊網(wǎng)——每日最新資訊28at.com

1.2. 類加載器種類

類加載器根據(jù)各自加載范圍的不同,劃分為四種類加載器:SDm28資訊網(wǎng)——每日最新資訊28at.com

  • 啟動類加載器(BootStrap ClassLoader):該類并不繼承ClassLoader類,其是由C++編寫實現(xiàn)。用于加載JAVA_HOME/jre/lib目錄下的類庫。
  • 擴(kuò)展類加載器(ExtClassLoader):該類是ClassLoader的子類,主要加載JAVA_HOME/jre/lib/ext目錄中的類庫。
  • 應(yīng)用類加載器(AppClassLoader):該類是ClassLoader的子類,主要用于加載classPath下的類,也就是加載開發(fā)者自己編寫的Java類。
  • 自定義類加載器:開發(fā)者自定義類繼承ClassLoader,實現(xiàn)自定義類加載規(guī)則。

上述三種類加載器的層次結(jié)構(gòu)如下如下:SDm28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片SDm28資訊網(wǎng)——每日最新資訊28at.com

類加載器的體系并不是“繼承”體系,而是委派體系,類加載器首先會到自己的parent中查找類或者資源,如果找不到才會到自己本地查找。類加載器的委托行為動機(jī)是為了避免相同的類被加載多次。SDm28資訊網(wǎng)——每日最新資訊28at.com

二. 什么是雙親委派模型?

如果一個類加載器在接到加載類的請求時,它首先不會自己嘗試去加載這個類,而是把這個請求任務(wù)委托給父類加載器去完成,依次遞歸,如果父類加載器可以完成類加載任務(wù),就返回成功;只有父類加載器無法完成此加載任務(wù)時,才由下一級去加載。SDm28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片SDm28資訊網(wǎng)——每日最新資訊28at.com

三. JVM為什么采用雙親委派機(jī)制

  • 通過雙親委派機(jī)制可以避免某一個類被重復(fù)加載,當(dāng)父類已經(jīng)加載后則無需重復(fù)加載,保證唯一性。
  • 為了安全,保證類庫API不會被修改

在工程中新建java.lang包,接著在該包下新建String類,并定義main函數(shù)SDm28資訊網(wǎng)——每日最新資訊28at.com

public class String {    public static void main(String[] args) {        System.out.println("demo info");    }}

此時執(zhí)行main函數(shù),會出現(xiàn)異常,在類 java.lang.String 中找不到 main 方法SDm28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片SDm28資訊網(wǎng)——每日最新資訊28at.com

出現(xiàn)該信息是因為由雙親委派的機(jī)制,java.lang.String的在啟動類加載器(Bootstrap classLoader)得到加載,因為在核心jre庫中有其相同名字的類文件,但該類中并沒有main方法。這樣就能防止惡意篡改核心API庫。SDm28資訊網(wǎng)——每日最新資訊28at.com

四. 類裝載的執(zhí)行過程?

類從加載到虛擬機(jī)中開始,直到卸載為止,它的整個生命周期包括了:加載、驗證、準(zhǔn)備、解析、初始化、使用和卸載這7個階段。其中,驗證、準(zhǔn)備和解析這三個部分統(tǒng)稱為連接(linking)。SDm28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片SDm28資訊網(wǎng)——每日最新資訊28at.com

類加載過程詳解

1.加載

圖片圖片SDm28資訊網(wǎng)——每日最新資訊28at.com

  • 通過類的全名,獲取類的二進(jìn)制數(shù)據(jù)流。
  • 解析類的二進(jìn)制數(shù)據(jù)流為方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)(Java類模型)
  • 創(chuàng)建java.lang.Class類的實例,表示該類型。作為方法區(qū)這個類的各種數(shù)據(jù)的訪問入口

圖片圖片SDm28資訊網(wǎng)——每日最新資訊28at.com

2.驗證

圖片圖片SDm28資訊網(wǎng)——每日最新資訊28at.com

驗證類是否符合JVM規(guī)范,安全性檢查SDm28資訊網(wǎng)——每日最新資訊28at.com

(1)文件格式驗證:是否符合Class文件的規(guī)范SDm28資訊網(wǎng)——每日最新資訊28at.com

(2)元數(shù)據(jù)驗證SDm28資訊網(wǎng)——每日最新資訊28at.com

  • 這個類是否有父類(除了Object這個類之外,其余的類都應(yīng)該有父類)
  • 這個類是否繼承(extends)了被final修飾過的類(被final修飾過的類表示類不能被繼承)
  • 類中的字段、方法是否與父類產(chǎn)生矛盾。(被final修飾過的方法或字段是不能覆蓋的)

(3)字節(jié)碼驗證- 主要的目的是通過對數(shù)據(jù)流和控制流的分析,確定程序語義是合法的、符合邏輯的。SDm28資訊網(wǎng)——每日最新資訊28at.com

(4)符號引用驗證:符號引用以一組符號來描述所引用的目標(biāo),符號可以是任何形式的字面量SDm28資訊網(wǎng)——每日最新資訊28at.com

比如:int i = 3; 字面量:3 符號引用:iSDm28資訊網(wǎng)——每日最新資訊28at.com

3.準(zhǔn)備

圖片圖片SDm28資訊網(wǎng)——每日最新資訊28at.com

為類變量分配內(nèi)存并設(shè)置類變量初始值

  • static變量,分配空間在準(zhǔn)備階段完成(設(shè)置默認(rèn)值),賦值在初始化階段完成
  • static變量是final的基本類型,以及字符串常量,值已確定,賦值在準(zhǔn)備階段完成
  • static變量是final的引用類型,那么賦值也會在初始化階段完成

圖片圖片SDm28資訊網(wǎng)——每日最新資訊28at.com

4.解析

圖片圖片SDm28資訊網(wǎng)——每日最新資訊28at.com

把類中的符號引用轉(zhuǎn)換為直接引用

比如:方法中調(diào)用了其他方法,方法名可以理解為符號引用,而直接引用就是使用指針直接指向方法。SDm28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片SDm28資訊網(wǎng)——每日最新資訊28at.com

5.初始化

圖片圖片SDm28資訊網(wǎng)——每日最新資訊28at.com

對類的靜態(tài)變量,靜態(tài)代碼塊執(zhí)行初始化操作SDm28資訊網(wǎng)——每日最新資訊28at.com

  • 如果初始化一個類的時候,其父類尚未初始化,則優(yōu)先初始化其父類。
  • 如果同時包含多個靜態(tài)變量和靜態(tài)代碼塊,則按照自上而下的順序依次執(zhí)行。

6.使用

圖片圖片SDm28資訊網(wǎng)——每日最新資訊28at.com

JVM 開始從入口方法開始執(zhí)行用戶的程序代碼SDm28資訊網(wǎng)——每日最新資訊28at.com

  • 調(diào)用靜態(tài)類成員信息(比如:靜態(tài)字段、靜態(tài)方法)
  • 使用new關(guān)鍵字為其創(chuàng)建對象實例

7.卸載

當(dāng)用戶程序代碼執(zhí)行完畢后,JVM 便開始銷毀創(chuàng)建的 Class 對象,最后負(fù)責(zé)運(yùn)行的 JVM 也退出內(nèi)存SDm28資訊網(wǎng)——每日最新資訊28at.com

五.類加載器面試

面試官:什么是類加載器,類加載器有哪些?SDm28資訊網(wǎng)——每日最新資訊28at.com

候選人:SDm28資訊網(wǎng)——每日最新資訊28at.com

JVM只會運(yùn)行二進(jìn)制文件,而類加載器(ClassLoader)的主要作用就是將字節(jié)碼文件加載到JVM中,從而讓Java程序能夠啟動起來。SDm28資訊網(wǎng)——每日最新資訊28at.com

常見的類加載器有4個SDm28資訊網(wǎng)——每日最新資訊28at.com

第一個是**啟動類加載器(BootStrap ClassLoader)**:其是由C++編寫實現(xiàn)。用于加載JAVA_HOME/jre/lib目錄下的類庫。SDm28資訊網(wǎng)——每日最新資訊28at.com

第二個是**擴(kuò)展類加載器(ExtClassLoader)**:該類是ClassLoader的子類,主要加載JAVA_HOME/jre/lib/ext目錄中的類庫。SDm28資訊網(wǎng)——每日最新資訊28at.com

第三個是**應(yīng)用類加載器(AppClassLoader)**:該類是ClassLoader的子類,主要用于加載classPath下的類,也就是加載開發(fā)者自己編寫的Java類。SDm28資訊網(wǎng)——每日最新資訊28at.com

第四個是自定義類加載器:開發(fā)者自定義類繼承ClassLoader,實現(xiàn)自定義類加載規(guī)則。SDm28資訊網(wǎng)——每日最新資訊28at.com

面試官:說一下類裝載的執(zhí)行過程?SDm28資訊網(wǎng)——每日最新資訊28at.com

候選人:SDm28資訊網(wǎng)——每日最新資訊28at.com

類從加載到虛擬機(jī)中開始,直到卸載為止,它的整個生命周期包括了:加載、驗證、準(zhǔn)備、解析、初始化、使用和卸載這7個階段。其中,驗證、準(zhǔn)備和解析這三個部分統(tǒng)稱為連接(linking)SDm28資訊網(wǎng)——每日最新資訊28at.com

1.加載:查找和導(dǎo)入class文件SDm28資訊網(wǎng)——每日最新資訊28at.com

2.驗證:保證加載類的準(zhǔn)確性SDm28資訊網(wǎng)——每日最新資訊28at.com

3.準(zhǔn)備:為類變量分配內(nèi)存并設(shè)置類變量初始值SDm28資訊網(wǎng)——每日最新資訊28at.com

4.解析:把類中的符號引用轉(zhuǎn)換為直接引用SDm28資訊網(wǎng)——每日最新資訊28at.com

5.初始化:對類的靜態(tài)變量,靜態(tài)代碼塊執(zhí)行初始化操作SDm28資訊網(wǎng)——每日最新資訊28at.com

6.使用:JVM 開始從入口方法開始執(zhí)行用戶的程序代碼SDm28資訊網(wǎng)——每日最新資訊28at.com

7.卸載:當(dāng)用戶程序代碼執(zhí)行完畢后,JVM 便開始銷毀創(chuàng)建的 Class 對象,最后負(fù)責(zé)運(yùn)行的 JVM 也退出內(nèi)存SDm28資訊網(wǎng)——每日最新資訊28at.com

面試官:什么是雙親委派模型?SDm28資訊網(wǎng)——每日最新資訊28at.com

候選人:SDm28資訊網(wǎng)——每日最新資訊28at.com

如果一個類加載器收到了類加載的請求,它首先不會自己嘗試加載這個類,而是把這請求委派給父類加載器去完成,每一個層次的類加載器都是如此,因此所有的加載請求最終都應(yīng)該傳說到頂層的啟動類加載器中,只有當(dāng)父類加載器返回自己無法完成這個加載請求(它的搜索返回中沒有找到所需的類)時,子類加載器才會嘗試自己去加載SDm28資訊網(wǎng)——每日最新資訊28at.com

面試官:JVM為什么采用雙親委派機(jī)制SDm28資訊網(wǎng)——每日最新資訊28at.com

候選人:SDm28資訊網(wǎng)——每日最新資訊28at.com

主要有兩個原因。SDm28資訊網(wǎng)——每日最新資訊28at.com

第一、通過雙親委派機(jī)制可以避免某一個類被重復(fù)加載,當(dāng)父類已經(jīng)加載后則無需重復(fù)加載,保證唯一性。SDm28資訊網(wǎng)——每日最新資訊28at.com

第二、為了安全,保證類庫API不會被修改SDm28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-38750-0.html什么是類加載器?什么是雙親委派模型?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 幾款熱門容器化編排工具對比

下一篇: Python中不起眼但是很實用的help函數(shù)

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 东光县| 阿拉善左旗| 兴城市| 日喀则市| 湘潭县| 简阳市| 大姚县| 文登市| 古田县| 米泉市| 海阳市| 林芝县| 东辽县| 梅州市| 临泽县| 阿合奇县| 高平市| 正蓝旗| 福建省| 偃师市| 垫江县| 阆中市| 曲阜市| 临朐县| 南通市| 保亭| 游戏| 宁乡县| 荆州市| 泰来县| 龙井市| 云南省| 曲周县| 浦县| 闽清县| 从化市| 五常市| 义马市| 千阳县| 隆化县| 蓬溪县|