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