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