笔记:类加载器
對于任意一個類,都需要由加載它的類加載器和這個類本身一同確立其在Java虛擬機中的唯一性,每一個類加載器,都擁有一個獨立的類名稱空間;這句話的意思是比較兩個類是否“相等”,只有在這兩個類是由同一個類加載器加載的前提下才有意義,否則,即使這兩個類來源于同一個Class文件,被同一個虛擬機加載,只要加載他們的類加載器不同,那這兩個類必定不相等。
“相等”是指類對象的 equals() 方法、isAssiggnableFrom() 方法、isInstance() 方法的返回結果,也有 使用 instanceof 關鍵字做對象所屬關系判定 等等。
啟動類加載器(Bootstrap ClassLoader):這個類加載器負責把放在 <JAVA_HOME>\lib 目錄中的、或者被 -Xbootclasspath參數所指定的路徑中,并且能被虛擬機識別的類庫加載到虛擬機內存中。開發者不能直接引用這個類加載器。
擴展類加載器(Extension ClassLoader):負責加載 <JAVA_HOME>\lib\ext 目錄中的、或者被 java.ext.dirs 系統變量所指定的路徑中的所有類庫,這個類加載器可以被開發者直接使用。
應用程序類加載器(Application ClassLoader):這個類加載器是 ClassLoader的 getSystemClassLoader() 方法的返回值;負責加載用戶類路徑(ClassPath)上所指定的類庫,開發者可以直接使用這個類加載器,如果應用程序中沒有自定義過自己的類加載器,一般情況下這個就是程序中默認的類加載器。
雙親委派模型:
雙親委派模型要求除了頂層的啟動類加載器之外,其余的類加載器都應當有自己的父類加載器。這里類加載器之間的父子關系一般不會以繼承關系實現,而是以組合的關系來實現。
工作過程:如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委托給父類加載器去完成,每一個層次的類加載器都是如此,因此所有的加載器請求最終都應該傳到頂層的啟動類加載器中,只有當父類加載器反饋自己無法完成這個加載請求(它的搜索范圍中沒有找到所需的類)時,子類加載器才會嘗試自己去加載。
作用:類隨著它的類加載器一起具備了一種帶有優先級的層次關系。例如類java.lang.Object,它由啟動類加載器加載。雙親委派模型保證任何類加載器收到的對java.lang.Object的加載請求,最終都是委派給處于模型最頂端的啟動類加載器進行加載,因此Object類在程序的各種類加載器環境中都是同一個類。
? 說明:雙親委派模型不是一個強制性的約束模型,而是Java設計者推薦給開發者的類加載器實現方式。在絕大多數類加載器都遵循這個模型,但是也有一小部分為了實現更好的功能不是這個模型。
雙親委派模型的實現:
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loadedClass<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {if (parent != null) {c = parent.loadClass(name, false);} else {c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}if (c == null) {// If still not found, then invoke findClass in order// to find the class.long t1 = System.nanoTime();c = findClass(name);// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}}
?
轉載于:https://www.cnblogs.com/super-jing/p/10863331.html
總結
- 上一篇: 33. Search in Rotate
- 下一篇: EasyDSS高性能RTMP、HLS(m