Java虛擬機JVM:雙親委派機制講解

1.類加載過程

2.JVM中的類加載器

①、啓動類加載器(Bootstrap ClassLoader)

  負責將存放在 <JAVA_HOME>/lib 目錄中的,或者被-Xbootclasspath 參數所指定的路徑中的,並且是虛擬機按照文件名識別的(僅按照文件名識別,如rt.jar,名字不符合的類庫即使放在lib目錄中也不會被加載)類庫加載到虛擬機內存中。
  啓動類加載器無法被Java程序直接引用。

  JDK 中的源碼類大都是由啓動類加載器加載,比如前面說的 java.lang.String,java.util.List等,需要注意的是,啓動類 main Class 也是由啓動類加載器加載。

②、擴展類加載器(Extension ClassLoader)

   這個類加載器由 sun.misc.Launcher$ExtClassLoader 實現,負責加載<JAVA_HOME>/lib/ext 目錄中的,或者被 java.ext.dirs 系統變量所指定的路徑中的所有類庫。

  開發者可以直接使用擴展類加載器。

③、應用程序類加載器(Application ClassLoader)

  由 sun.misc.Launcher$AppClassLoader 實現。由於這個類加載器是 ClassLoader.getSystemClassLoader() 方法的返回值,所以一般也稱它爲系統類加載器。

  它負責加載用戶類路徑ClassPath上所指定的類庫,開發者可以直接使用這個類加載器。如果應用程序中沒有自定義過自己的類加載器,一般情況下這個就是程序中默認的類加載器。

   通常項目中自定義的類,都會放在類路徑下,由應用程序類加載器加載。

④、自定義類加載器(User ClassLoader)

   這是由用戶自己定義的類加載器,一般情況下我們不會自定義類加載器,但有些特殊情況,比如JDBC能夠通過連接各種不同的數據庫就是自定義類加載器來實現的。

3.什麼是雙親委派機制

首先,我們設想一下,JAVA設計者爲什麼要使用和設計這種機制呢?

如果有不法分子在你項目中構造了一個java.lang.String類,並在該類中植入了一些不良代碼,但你自己渾然不知,以爲使用的String類還是 rt.jar 包下的,那可能會給你係統造成不良的影響。聰明的Java虛擬機實現者也想到了這個問題,於是,他們引入了 雙親委派模型來解決這個問題。

接下來我們在看看雙親委派機制的實現過程:

說明:雙親委派機制就是如果一個類加載器收到了類加載請求,它首先不會自己嘗試去加載這個類,而是把這個請求委派給父類加載器去完成,每一個層次的類加載器都是如此,因此所有的加載請求最終都應該傳送到頂層的啓動類加載器中,只有父類加載器反饋到無法完成這個加載請求(它的搜索範圍沒有找到這個類),子加載器纔會嘗試自己去加載。

因此,上面提到的問題就可以被避免了。因爲雙親委派機制會優先加載使用內置類庫中的String類,而不會用到自定義的String類。

 

參考鏈接:

https://www.cnblogs.com/ysocean/p/11878803.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章