柚子快報(bào)激活碼778899分享:【JVM】雙親委派模型
柚子快報(bào)激活碼778899分享:【JVM】雙親委派模型
文章目錄
雙親委派模型(面試高頻)類加載器工作過程存在意義
雙親委派模型(面試高頻)
之所以這個(gè)東西面試出場(chǎng)概率高高,最大的原因就是它起的名字很好聽
描述了查找 .class 文件的策略。
類加載器
JVM 中進(jìn)行類加載的操作,是有一個(gè)專門的模塊,稱為“類加載器”(ClassLoader)。JVM 中的類加載器默認(rèn)是由三個(gè)(也可以自定義個(gè)數(shù))
類加載器的作用,給它一個(gè)“權(quán)限定類名”(帶有包的類名(java. lang. String)),給了之后,就找到對(duì)應(yīng)的 .class 文件。這里的類加載器就是從不同的目錄中進(jìn)行查找
BootstrapClassLoader
負(fù)責(zé)查找標(biāo)準(zhǔn)庫(kù)的目錄 ExtensionClassLoader
負(fù)責(zé)查找擴(kuò)展庫(kù)的目錄Java 語法的規(guī)范里面描述了標(biāo)準(zhǔn)庫(kù)中應(yīng)該有哪些功能。實(shí)現(xiàn) JVM 的廠商/組織會(huì)在標(biāo)準(zhǔn)庫(kù)的基礎(chǔ)上擴(kuò)充一些額外的功能(JVM 內(nèi)置的,不同的廠商擴(kuò)展的可能不太一樣)這塊內(nèi)容在上古時(shí)期用處比較多,但隨著時(shí)代的發(fā)展,這里的內(nèi)容很少會(huì)使用了 ApplicationClassLoader
負(fù)責(zé)查找當(dāng)前項(xiàng)目的代碼目錄,以及第三方庫(kù)的目錄
上述的三個(gè)類加載器,存在“父子關(guān)系”
不是面向?qū)ο笾械模割愖宇惱^承關(guān)系而是類似于“二叉樹”。有一個(gè)指針(引用)parent,指向自己的“父”類加載器
雙親委派模型,就描述了上述類加載器之間是符合配合工作的
工作過程
雙親委派模型工作過程:
從 ApplicationClassLoader 作為入口,先開始工作 ApplicationClassLoader 不會(huì)立即搜索自己負(fù)責(zé)的目錄,會(huì)把搜索的任務(wù)交給自己的父親 代碼就進(jìn)入到 ExtensionClassLoader 范疇了,但它也不會(huì)立即搜索自己負(fù)責(zé)的目錄,也要把搜索的任務(wù)交給自己的父親 代碼就進(jìn)入到 BootstrapClassLoader 范疇了,它也不想立即搜索自己負(fù)責(zé)的目錄,也想把搜索的任務(wù)交給自己的父親 BooststracpClassLoader 發(fā)現(xiàn)自己沒有父親,才會(huì)真正搜索負(fù)責(zé)的目錄(標(biāo)準(zhǔn)庫(kù)目錄),通過全限定類名,嘗試在標(biāo)準(zhǔn)庫(kù)目錄中找到符合要求的 .class 文件
如果找到了,接下來就直接進(jìn)入到打開文件/讀文件等流程中如果沒找到,就回到孩子這一輩的類加載器中,繼續(xù)嘗試加載 ExtensionClassLoader 收到父親交回給他的任務(wù)之后,自己進(jìn)行搜索負(fù)責(zé)目錄(擴(kuò)展庫(kù)的目錄)
如果找到了,接下來就進(jìn)入到后續(xù)流程如果沒找到,也就再回到孩子這一輩的類加載器中繼續(xù)嘗試加載 ApplicationClassLoader 收到父親交回給他的任務(wù)之后,自己進(jìn)行搜索負(fù)責(zé)的目錄(當(dāng)前項(xiàng)目目錄/第三方庫(kù)目錄)
如果找到了,接下來就進(jìn)入后續(xù)流程如果沒找到,也是回到孩子這一輩的類加載器中嘗試?yán)^續(xù)加載。但是由于默認(rèn)情況下 ApplicationClassLoader 沒有孩子了,此時(shí)說明類加載過程失敗了,就會(huì)拋出 ClassNotFoundException 異常
存在意義
上述設(shè)定的最主要的目的就是為了確保這幾個(gè)類加載器之間的優(yōu)先級(jí)
按照上述的順序,假定在代碼中自己定義了一個(gè) java.lang.String 這樣的類。最終程序執(zhí)行效果是:自定義的類不會(huì)被 JVM 加載
因?yàn)楫?dāng)我們拿著這個(gè)類給類加載器找的時(shí)候,先 BootstrapClassLoader 到標(biāo)準(zhǔn)庫(kù)中找,就找到了這個(gè)類,直接就從標(biāo)準(zhǔn)庫(kù)中加載了,就不會(huì)回到 ApplicationClassLoader (你自己寫的代碼中)這一層進(jìn)行加載 設(shè)定就是為了避免你寫的類的名字和標(biāo)準(zhǔn)庫(kù)的重復(fù)了,導(dǎo)致標(biāo)準(zhǔn)庫(kù)的類的功能失效
柚子快報(bào)激活碼778899分享:【JVM】雙親委派模型
精彩文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。