JVM雙親委派模型


簡單說說你了解的類加載器,可以打破雙親委派么,怎么打破。

1) 什么是類加載器?

類加載器 就是根據指定全限定名稱將class文件加載到JVM內存,轉為Class對象。

  • 啟動類加載器(Bootstrap ClassLoader):由C++語言實現(針對HotSpot),負責將存放在<JAVA_HOME>\lib目錄或-Xbootclasspath參數指定的路徑中的類庫加載到內存中。
  • 其他類加載器:由Java語言實現,繼承自抽象類ClassLoader。如:
  • 擴展類加載器(Extension ClassLoader):負責加載<JAVA_HOME>\lib\ext目錄或java.ext.dirs系統變量指定的路徑中的所有類庫。
  • 應用程序類加載器(Application ClassLoader)。負責加載用戶類路徑(classpath)上的指定類庫,我們可以直接使用這個類加載器。一般情況,如果我們沒有自定義類加載器默認就是用這個加載器。

2)雙親委派模型

雙親委派模型工作過程是:

如果一個類加載器收到類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器完成。每個類加載器都是如此,只有當父加載器在自己的搜索范圍內找不到指定的類時(即ClassNotFoundException),子加載器才會嘗試自己去加載。

雙親委派模型中的"雙親"並不是指它有兩個父類加載器的意思,一個類加載器只應該有一個父加載器。上面的步驟中,有兩個角色:

  • 父類加載器(parent classloader):它可以替子加載器嘗試加載類
  • 引導類加載器(bootstrap classloader): 子類加載器只能判斷某個類是否被引導類加載器加載過,而不能委托它加載某個類;換句話說,就是子類加載器不能接觸到引導類加載器,引導類加載器對其他類加載器而言是透明的。

3)為什么需要雙親委派模型?

在這里,先想一下,如果沒有雙親委派,那么用戶是不是可以自己定義一個java.lang.Object的同名類,java.lang.String的同名類,並把它放到ClassPath中,那么類之間的比較結果及類的唯一性將無法保證,因此,為什么需要雙親委派模型?防止內存中出現多份同樣的字節碼

怎么打破雙親委派模型?

打破雙親委派機制則不僅要繼承ClassLoader類,還要重寫loadClass和findClass方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM