jvm類加載器基礎解析
【類加載器簡介】
類加載器(classloader)用于將類的class文件加載到JVM虛擬機。JVM有三種加載器,引導類加載器器(bootstrapclassloader)、擴展類加載器(extensionsclassloader)和應用類加載器(applicationclassloader),另外還可以繼承java.lang.ClassLoader類創(chuàng)建自定義加載器。
【類加載器種類】
1.引導類加載器(BootStrap):并不是一個Java類,采用C++語言編寫、內嵌在JVM內核里面,使用JNI(JavaNativeInterface)調用native代碼執(zhí)行。引導類加載器負責加載核心的Java類庫,比如位JAVA_HOME/jre/lib下面的rt.jar文件,該jar文件包含一些常見類如:
java.lang.System java.util.HashMap
2.擴展類加載器(ExtClassLoader):繼承自java.lang.ClassLoader類,用于加載擴展路徑下面的jar文件,擴展路徑為JAVA_HOME/jre/lib/ext
3.應用類加載器(AppClassLoader):繼承自java.lang.ClassLoader類,用來加載classpath下面的類。大笑
【類加載器的委托機制】
1.當應用程序需要加載一個類時,會按照BootStrap、ExtClassLoader、AppClassLoader的順序,到相應的路徑下面加載需要的類的字節(jié)碼文件。
2.我們可以把自定義的類編譯為class文件后打成jar包,放置到JAVA_HOME/jre/lib/ext路徑。類加載器加載時,將使用ExtClassLoader加載器從JAVA_HOME/jre/lib/ext路徑加載,而不會使用AppClassLoader加載器到classpath下加載。
3.在按照BootStrap、ExtClassLoader、AppClassLoader順序使用類加載器,嘗試加載類都失敗之后,將拋出類找不到異常:java.lang.ClassNotFoundException
【應用demo】
1.BootStrap:使用C++編寫、嵌入在JVM內核、并不是一個Java類
ClassLoader loader = System.class.getClassLoader(); System.out.println(loader); //null
2. AppClassLoader:使用AppClassLoader加載器加載classpath下面的類
ClassLoader loader = ClassLoaderTest.class.getClassLoader(); System.out.println(loader.getClass().getName()); //sun.misc.Launcher$AppClassLoader
3.ExtClassLoader:用于加載JAVA_HOME/jre/lib/ext路徑下的Java類,一旦找到將不會到classpath加載。
編寫自定義Hello類,打成jar包進行導出到C:\ProgramFiles\Java\jdk1.7.0\jre\lib\ext\excelsoft.jar路徑。
ClassLoader loader = Hello.class.getClassLoader(); System.out.println(loader.getClass().getName()); //sun.misc.Launcher$ExtClassLoader
===============================
類加載器是一個相對比較復雜的話題,僅作入門了解!
總結
以上就是本文關于jvm類加載器基礎解析的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關文章
springboot 事件監(jiān)聽的實現(xiàn)方法
這篇文章主要介紹了springboot 事件監(jiān)聽的實現(xiàn)方法,并詳細的介紹了四種監(jiān)聽方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04Spring Data MongoDB中實現(xiàn)自定義級聯(lián)的方法詳解
這篇文章主要給大家介紹了關于Spring Data MongoDB中實現(xiàn)自定義級聯(lián)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2017-11-11