jvm类加载器以及双亲委派
首先來了解幾個概念:
類加載:
??? 概念:虛擬機把描述類的數據從Class文件加載到內存,并對數據進行校驗--轉換解析--初始化,最終形成能被java虛擬機直接使用的java類型,就是jvm的類加載機制。
??? 類加載包含了以下過程:加載--驗證--準備--解析--初始化--使用--卸載
?
類加載器:
??? 首先,什么是類加載器?
概念:把類加載階段中"通過一個類的全限定名來獲取描述此類的二進制流"這個動作放到jvm外部去實現,以便讓應用程序自己決定如何去獲取所需要的類。實現這個動作的代碼模塊被稱為"類加載器"。
?
分類:(針對hot spot而言,因為MRP,maxine的虛擬機完全是由java實現)
站在java虛擬機的角度上講,只存在兩種不同的類加載器。啟動類加載器 和 其他類加載器。
??? 啟動類加載器:由c++實現,是虛擬機自身的一部分.
??? 其他類加載器:由java實現,獨立于虛擬機外部,全繼承于抽象類java.lang.ClassLoader.
站在java開發人員的角度上講? ,分為三種
? *啟動類加載器(BootStrap ClassLoader):? 前面已經提到,主要加載<JAVA_HOME>/lib目錄中 ,或被-Xbootclasspath參數指定路徑中的jar包。
??*擴展類加載器(Extension ClassLoader):由sun.misc.Launcher$ExtClassLoader來實現。主要加載<JAVA_HOME>/lib/ext 目錄中 ,或被java.ext.dirs系統變量指定路徑中所有類庫。
? *應用程序類加載器(Application ClassLoader):由sun.misc.Launcher$AppClassLoader來實現。由于這個類加載器是ClassLoader中getSystemClassLoader()方法返回值,所以也叫系統類加載器。負責加載用戶類路徑上(ClassPath)指定的類庫,是開發過程中默認的加載器,開發者可直接使用。
說到這里,不得不提一下"雙親委派模型(Parent Delegation Model)"。如上圖。
?
雙親委派模型:描述類加載器之間的層次關系的就是雙親委派模型。
雙親委派模型要求出頂層的 啟動類加載器 外,其余類加載器都應有自己的父類加載器。
加載器之間的父子關系不是靠繼承的關系實現,是使用組合關系的關系來復用父類加載器的代碼。
?
雙親委派模型工作過程:若一個類加載器收到類加載請求,他首先不會自己嘗試去加載這個類,而是把這個請求委派給父類加載器去完成,每一層類加載器都是如此,所以所有請求都會傳送到頂層的BootStrap ClassLoader,只有當父類加載器反饋自己無法完成這個加載請求(它的搜索范圍沒找到),子加載器才會自己嘗試去加載。
?
使用雙親委派模型好處:
java類以及它的類加載器一起具備了一種帶有優先級的層次關系。如 java.lang.Object(它在rt.jar之中)。
??? 首先我們要知道一點,同一個類 被不同的 類加載器 加載成兩個類之后,這兩個類是不同的。
如果java.lang.Object類被不同的類加載器加載很多次,jvm中存在了多個不同的Object類,那么java類型體系中最基礎的行為也無從保證,應用程序會一片混亂(we know,all the class extends from java.lang.Object,如果Object存在多個品種,那絕對是災難)。
??? 相反,使用了雙親委派模型,無論哪個類加載器去加載,都會委派到BoorStrap ClassLoader進行加載,保證了Object在各個類加載器環境中,都是同一個類。
?
? 再提一點雙親委派模型的工作機制,以類 A 為例,A如果以Application ClassLoader方式來加載,Application ClassLoader委派給Extension ClassLoader,再到BootStrap ClassLoader.
然而,BootStrap ClassLoader管理范圍內(<JAVA_HOME>/lib目錄中 ,或-Xbootclasspath參數指定路徑中的jar包)沒查到類A,那么就讓最初請求的類加載器,Application ClassLoader來加載
?
at last,提一點,雙親委派模型 在jvm成長史上被重大破壞過三次,但是 雙親委派模型確實不錯,還是像小強一樣的活了下來
轉載于:https://www.cnblogs.com/xiaoliu66007/p/3376219.html
總結
以上是生活随笔為你收集整理的jvm类加载器以及双亲委派的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux vi格式化文件命令
- 下一篇: error while loading