1. 程式人生 > >jvm學習-ClassLoader(二)

jvm學習-ClassLoader(二)

重復 clas 我們 pat 下層 需求 如果 結構 ssp

ClassLoader結構

技術分享圖片

jdk加載的4個步驟

CustomClassLoader 用戶自定義的classLoader

APPClassLoader主要加載classPath下面的class

Extension ClassLoader 主要負責加載JAVA_HOME/jre/lib/ext/目下的所有jar

BootStrap ClassLoader:負責加載JDK中的核心類庫,如:rt.jar、resources.jar、charsets.jar等

java類加載器采用雙親委托模式

則是從下級往上級詢問是否有加載。如果沒加載 再從上級往下下級查找 如果找到就加載 沒有找到就繼續向下詢問

比如 在程序創建一個Test類。然後在main方法打印這個這個Test類的classLoader 會打印 APPClassLoader

因為appClassLoader會逐個向上詢問是否加載 則都沒有加載 然後從上級bootstrap到Extension ClassLoader會在他的掃描的jar裏面找有沒有Test這個class都沒有找到 最終APPClassLoader在classPath找到這個類 加載

我們改變一下程序 將Test類打包成一個jar 放到ext目錄下

再次打印則會輸出加載類是Extension ClassLoader

雙親委托模式的好處

1. 防止重復加載

缺點 :

上層類加載器無法獲得下層類加載器加載的類

雙親委托模式是jdk的默認實現 但是不一定要完全按照這個模式

比如tomcat webappClassLoader 就會先加載自己的class 找不到再委托父類

自定義ClassLoader 必須繼承 classLoader類

classLoader的重要方法

loadClass(String name)文件名字

   defineCalss(byte[] b int off,int lent) class文件的內容      findClass() loadClass會掉findClass方法      findLadedClass(String name) 如果加載了 則不加載 沒加載 才加載 為什麽要重寫classLoader 因為默認實現的幾種classLoader只會加載特定路徑下面的class 我們往往會根據需求加載別的路徑下的class 比如網絡請求的class二進制信息

jvm學習-ClassLoader(二)