jvm學習-ClassLoader(二)
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的重要方法
jvm學習-ClassLoader(二)