Tomcat WebappClassLoader 类加载机制源码分析
需要了解的知識JVM 類加載機制深入淺出
tomcat中的ClassLoader
- 啟動類加載器(BootStrap ClassLoader):引導類裝入器是用本地代碼實現的類裝入器,它負責將 jdk中jre/lib下面的核心類庫或-Xbootclasspath選項指定的jar包加載到內存中。由于引導類加載器涉及到虛擬機本地實現細節,開發者無法直接獲取到啟動類加載器的引用,所以不允許直接通過引用進行操作。
- 擴展類加載器(Extension ClassLoader):擴展類加載器是由Sun的ExtClassLoader(sun.misc.Launcher$ExtClassLoader)實現的。它負責將jdk中jre/lib/ext或者由系統變量-Djava.ext.dir指定位置中的類庫加載到內存中。開發者可以直接使用標準擴展類加載器。
- 系統類加載器(System ClassLoader):系統類加載器是由 Sun的 AppClassLoader(sun.misc.Launcher$AppClassLoader)實現的。它負責將系統類路徑java -classpath或-Djava.class.path變量所指的目錄下的類庫加載到內存中。開發者可以直接使用系統類加載器。
- StandardClassLoader 負責加載tomcat容器相關的類
- WebappClassLoader 是每個web項目對應一個WebappClassLoader。這樣做的目的是每個項目中都會有相同的類(package+classname),而類的內容不一樣。這樣每個項目一個WebappClassLoader可以達到隔絕項目類沖突的問題。
下面我們主要講解下WebappClassLoader的類加載機制
第一步
首先調用findLoaderClass0() 方法檢查WebappClassLoader中是否加載過此類。
WebappClassLoader 加載過的類都存放在 resourceEntries 緩存中。
第二步
如果第一步沒有找到,則繼續檢查JVM虛擬機中是否加載過該類。
調用ClassLoader的findLoadedClass() 方法檢查
第三步
如果前兩步都沒有找到,則使用AppClassloader加載該類(也就是當前JVM的ClassPath)
第四步
如果前三步都沒找到,通過filter() 方法檢查該類是否在定義的包名下,如果在則通過 StandardClassLoader類加載。
第五步
如果前4步都沒有找到,將由WebappClassLoader來加載。
從當前的工程的Web-INF/classes 目錄下查找
如果找到,則創建ResourceEntry對象,保存這個類的元信息,并把他保存在WebappClassLoader的resourceEntries中,便于下次查找。
本人簡書blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點擊這里快速進入簡書
GIT地址:http://git.oschina.net/brucekankan/
點擊這里快速進入GIT
總結
以上是生活随笔為你收集整理的Tomcat WebappClassLoader 类加载机制源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tomcat Filter 源码分析
- 下一篇: Tomcat 之 Session的活化和