JBoss、Tomcat Classloader不完全分析
http://seanhe.iteye.com/blog/841723
?
由于平時(shí)項(xiàng)目中用到的還是JBoss 4.2.x所以我這里的分析時(shí)針對(duì)這個(gè)版本的,不一定適用其他JBoss版本。
下面言歸正傳。
JBoss為了實(shí)現(xiàn)類的共享引入了class loader repository的概念,并且設(shè)計(jì)了org.jboss.mx.loading.UnifiedClassLoader3 (UCL)來(lái)完成sharing classes的主要功能。
UCL和UnifiedLoaderRepository3 一對(duì)多的關(guān)系,默認(rèn)情況下一個(gè)jboss實(shí)例中只有一個(gè)UnifiedLoaderRepository3實(shí)例,這個(gè)UnifiedLoaderRepository實(shí)例會(huì)和所有的UCL關(guān)聯(lián)。
NoAnnotationClassLoader是UCL的父classloader用來(lái)加載$JBOSS_HOME/lib下的jar,system class loader是NoAnnotationClassLoader的父classloader。
這幾個(gè)對(duì)象的關(guān)系請(qǐng)見(jiàn)下圖
從上圖可以看出默認(rèn)情況下所有的UCL共享一個(gè)Repository,通過(guò)Repository可以實(shí)現(xiàn)class的共享。 UnifiedLoaderRepository3實(shí)例中維護(hù)著兩個(gè)容器,一個(gè)是class cache:這個(gè)容器很明顯緩存了一些class,這樣可以提高loadClass方法的執(zhí)行效率;另一個(gè)是packagesMap:這個(gè)map維護(hù)的是 類的包名和UCL的mapping關(guān)系。具體UCL按什么邏輯load class的請(qǐng)看下面的活動(dòng)圖:
UnifiedClassLoader3的繼承結(jié)構(gòu)如下圖所示,UnifiedClassLoader3的父類RepositoryClassLoader重寫(xiě)了URLClassLoader的loadClass方法,實(shí)現(xiàn)了上圖的邏輯
下面請(qǐng)看一下相關(guān)代碼:
RepositoryClassLoader.java
有幾點(diǎn)結(jié)論可以加深一些印象:
由于jboss對(duì)所有UCL的共享機(jī)制就會(huì)導(dǎo)致出現(xiàn)一些class的版本沖突問(wèn)題,一些應(yīng)用加載不到自己的應(yīng)用需要的class。對(duì)于這個(gè)問(wèn)題JBOSS提供了一些解決措施:http://community.jboss.org/wiki/ClassLoadingConfiguration。后面我會(huì)再整理一下此前我遇到過(guò)的一個(gè)class沖突的case和解決辦法。
Tomcat6/7 class loader機(jī)制
Tomcat class loader層次結(jié)構(gòu)
Tomcat的class load機(jī)制較Jboss來(lái)說(shuō)要簡(jiǎn)單
當(dāng)web應(yīng)用需要load class時(shí)先調(diào)用WebAppClassloader的loadClass方法,loadClass內(nèi)部邏輯如下:
具體的代碼可以看WebAppClassloader.loadClass(..)
?
參考文檔:
http://community.jboss.org/wiki/JBossClassLoadingUseCases
http://community.jboss.org/wiki/ClassLoadingConfiguration
http://community.jboss.org/wiki/EnableClassloaderLogging
http://agapple.iteye.com/blog/791940
http://www.iteye.com/topic/826661
轉(zhuǎn)載于:https://www.cnblogs.com/lingxue3769/archive/2012/03/01/2375997.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的JBoss、Tomcat Classloader不完全分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python “with” keywor
- 下一篇: asp.net各种类型视频播放代码(全)