虛擬機類加載機制 第二節:類加載器(JVM筆記)

類與類加載器

對於任意一個類都要由加載他的類加載器和這類本身一同確定其在java虛擬機中的唯一性。也就是說比較兩個類是否相等,只有在這兩個類是由同一個類加載器加載的前提下才有意義,否則即使這兩個類是來源於同一個Class文件,只要加載他的加載器不同,這兩個類就必定不相等。

雙親委派模型

站在JVM的角度講只有兩種不同的類加載器:

  1. 啓動類加載器,這個類加載器使用C++語言實現,虛擬機自身的一部分
  2. 其他類加載器,這些類加載器都是用java語言實現,獨立於虛擬機,並且全部繼承自抽象類java.lang.ClassLoader

從java開發人員的角度講,可以劃分更細,但絕大多數程序都會用到一下三種類加載器:

  1. 啓動類加載器(Bootstrap ClassLoader),這個類加載器負責加載< JAVA_HOME >/lib目錄中的,並且被虛擬機識別的(按照文件名識別,如rt.jar,名稱不符合即使放在lib中也無法被識別加載)類庫加載到虛擬機內存中。啓動類加載器無法被java程序直接引用
  2. 擴展類加載器(Extension ClassLoader):由sun.misc.Launcher$ExtClassLoader實現,負責加載< JAVA_HOME >/lib/ext目錄中的,或者被java.ext.dirs系統變量所指定路勁中的所有類庫,開發者可以直接使用。
  3. 應用程序類加載器(Application ClassLoader):這個類由sun.misc.Launcher$AppClassLoader來實現,也被稱爲系統類加載器。他負責加載用戶類路勁下所指定的類庫,開發者可以直接使用這個類加載器,如果應用程序沒有自定義過自己的類加載器,一般情況下這個就是默認的類加載器。

我們的應用程序都是三種類加載器相互配合進行加載的,如有必要可自定義。類加載器之間的關係如下圖所示:

上圖所示的類類加載器之間的層次關係,成爲類加載器的雙親委派模型。雙親委派模型除了頂層的啓動類加載器外,其餘的類加載器都應當有自己的福類加載器。這裏的父子關係一般不會用集成,而是使用組合關係來複用父加載器的代碼。

雙親委派模型工作過程:

如果一個類加載器收到了類加載的請求,它首先不會自己嘗試加載這個類,而是把這個類請求委派給父類加載器去完成,每一層的類加載器都是如此,因此所有的加載請求最終都應該傳送到頂層的啓動類加載器中,只有父加載器反饋無法完成這個家在請求時候,子類加載器纔會嘗試自己加載

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