<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-109  評論-187  文章-25  trackbacks-0

    ClassLoader in Tomcat (http://rosonsandy.blogdriver.com/rosonsandy/871539.html


    1 - Tomcat 的類載入器的結(jié)構(gòu)

    Tomcat Server 在啟動的時候?qū)?gòu)造一個ClassLoader樹,以保證模塊的類庫是私有的
    Tomcat Server
    ClassLoader結(jié)構(gòu)如下:

    ??????? +-----------------------------+?

    ??????? |???????? Bootstrap?????????? |?

    ??????? |???????????? |???? ??????????|?

    ??????? |????????? System???????????? |?

    ??????? |???????????? |?????????????? |?

    ??????? |????????? Common???????????? |?

    ??????? |???????? /????? \??????????? |?

    ??????? |???? Catalina? Shared??????? |?

    ??????? |?????????????? /??? \??????? |?

    ???? ????|????????? WebApp1? WebApp2?? |?

    ??????? +-----------------------------+

    其中:
    - Bootstrap -
    載入JVM自帶的類和$JAVA_HOME/jre/lib/ext/*.jar
    - System -
    載入$CLASSPATH/*.class
    - Common -
    載入$CATALINA_HOME/common/...,它們對TOMCAT和所有的WEB APP都可見
    - Catalina -
    載入$CATALINA_HOME/server/...,它們僅對TOMCAT可見,對所有的WEB APP都不可見
    - Shared -
    載入$CATALINA_HOME/shared/...,它們僅對所有WEB APP可見,對TOMCAT不可見(也不必見)
    - WebApp -
    載入ContextBase?/WEB-INF/...,它們僅對該WEB APP可見

    2 - ClassLoader 的工作原理

    每個運行中的線程都有一個成員contextClassLoader,用來在運行時動態(tài)地載入其它類
    系統(tǒng)默認的contextClassLoadersystemClassLoader,所以一般而言java程序在執(zhí)行時可以使用JVM自帶的類、$JAVA_HOME/jre/lib/ext/中的類和$CLASSPATH/中的類
    可以使用
    Thread.currentThread().setContextClassLoader(...); 更改當前線程的contextClassLoader,來改變其載入類的行為

    ClassLoader 被組織成樹形,一般的工作原理是:
    1)
    線程需要用到某個類,于是contextClassLoader被請求來載入該類
    2) contextClassLoader
    請求它的父ClassLoader來完成該載入請求
    3)
    如果父ClassLoader無法載入類,則contextClassLoader試圖自己來載入

    注意 WebApp?ClassLoader的工作原理和上述有少許不同:
    它先試圖自己載入類(在ContextBase?/WEB-INF/...中載入類),如果無法載入,再請求父ClassLoader完成

    由此可得:
    -
    對于WEB APP線程,它的contextClassLoaderWebApp?ClassLoader
    -
    對于Tomcat Server線程,它的contextClassLoaderCatalinaClassLoader

    3 類的查找

    ClassLoader類中l(wèi)oadClass方法為缺省實現(xiàn),用下面的順序查找類:

    1、調(diào)用findLoadedClass方法來檢查是否已經(jīng)被加載。如果沒有則繼續(xù)下面的步驟。

    2、如果當前類裝載器有一個指定的委托父裝載器,則用委托父裝載器的loadClass方法加載類,也就是委托給父裝載器加載相應的類。

    3、如果這個類裝載器的委托層級體系沒有一個類裝載器加載該類,則使用類裝載器定位類的特定實現(xiàn)機制,調(diào)用findClass方法來查找類。

    4?- 部分原代碼分析

    4.1 - org/apache/catalina/startup/Bootstrap.java

    Bootstrap中定義了三個classloader:commonLoader,catalinaLoader,sharedLoader.三者關(guān)系如下:

    // 注意三個自己定置的ClassLoader的層次關(guān)系:?

    ??????????? // systemClassLoader (root)?

    ?? ?????????? //?? +--- commonLoader?

    ??????????? //????????? +--- catalinaLoader?

    ??????????? //????????? +--- sharedLoader

    Tomcat Server 線程的起點
    構(gòu)造ClassLoader樹,通過Thread.currentThread().setContextClassLoader(catalinaLoader)設(shè)置當前的classloader為catalinaLoader。
    載入若干類,然后轉(zhuǎn)入org.apache.catalina.startup.Catalina類中

    4.2 org.apache.catalina.loader.StandardClassLoader.java

    通過看loadClass這個方法來看tomcat是如何加載類的,順序如下:

    (0) Check our previously loaded class cache查找已經(jīng)裝載的class
    ??????? clazz = findLoadedClass(name);

    (1)?If a system class, use system class loader通過系統(tǒng)classloader來裝載class

    ??????? ClassLoader loader = system;
    ??????????? clazz = loader.loadClass(name);

    (2) Delegate to our parent if requested如果有代理則使用父類classloader

    ??????????? ClassLoader loader = parent;
    ??????????? if (loader == null)
    ??????????????? loader = system;
    ????????????clazz = loader.loadClass(name);

    (3) Search local repositories 查找本地類池,比如$CATALINA_HOME/server

    ?????????? clazz = findClass(name);

    (4) Delegate to parent unconditionally 默認使用代理裝載器

    [ 查看代碼]

    4.3 - org/apache/catalina/startup/ClassLoaderFactory.java

    根據(jù)設(shè)置創(chuàng)建并返回StandardClassLoader的實例

    [ 查看代碼]

    4.4 - org/apache/catalina/loader/StandardClassLoader.java

    類載入器

    4.5 - org/apache/catalina/startup/SecurityClassLoad.java

    該類僅包含一個靜態(tài)方法,用來為catalinaLoader載入一些類

    [ 查看代碼]

    Appendix - 參考

    [1] http://jakarta.apache.org/tomcat/ 中的Tomcat 4.1.x文檔Class Loader HOW-TO

    在一個 JVM 中可能存在多個 ClassLoader ,每個 ClassLoader 擁有自己的 NameSpace 。一個 ClassLoader 只能擁有一個 class 對象類型的實例,但是不同的 ClassLoader 可能擁有相同的 class 對象實例,這時可能產(chǎn)生致命的問題。如 ClassLoaderA ,裝載了類 A 的類型實例 A1 ,而 ClassLoaderB ,也裝載了類 A 的對象實例 A2 。邏輯上講 A1=A2 ,但是由于 A1 A2 來自于不同的 ClassLoader ,它們實際上是完全不同的,如果 A 中定義了一個靜態(tài)變量 c ,則 c 在不同的 ClassLoader 中的值是不同的。

    posted on 2006-04-18 08:48 小小程序程序員混口飯吃 閱讀(451) 評論(0)  編輯  收藏 所屬分類: java
    主站蜘蛛池模板: 亚洲熟妇丰满多毛XXXX| 爱情岛论坛免费视频| 狠狠亚洲婷婷综合色香五月排名| 无码国产精品久久一区免费| 国产成年无码久久久免费| 国产精品亚洲va在线观看| 亚洲制服丝袜一区二区三区| 亚洲午夜久久久久久久久电影网| 日韩一级免费视频| 99在线精品视频观看免费| 国产免费无码一区二区 | 18禁黄网站禁片免费观看不卡| 一级一级毛片免费播放| 亚洲AV性色在线观看| 亚洲一卡2卡4卡5卡6卡残暴在线| 亚洲综合精品一二三区在线 | 在线视频网址免费播放| 美女被爆羞羞网站免费| 国产亚洲一卡2卡3卡4卡新区| 亚洲偷偷自拍高清| 亚洲毛片无码专区亚洲乱| 久久久婷婷五月亚洲97号色| 久久精品国产亚洲av成人| 亚洲热线99精品视频| 亚洲日韩在线观看免费视频| 深夜国产福利99亚洲视频| 日韩毛片无码永久免费看| 国产精品久久久久久久久久免费| 性xxxxx免费视频播放| 人与禽交免费网站视频| 成年在线观看网站免费| 成**人免费一级毛片| 成人免费毛片观看| 麻豆国产人免费人成免费视频| 性盈盈影院免费视频观看在线一区| 日韩免费a级毛片无码a∨| 成人免费a级毛片| 妞干网免费视频观看| 国产公开免费人成视频| 男人的天堂亚洲一区二区三区 | 免费国产一级特黄久久|