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