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

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

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

    Sung in Blog

               一些技術文章 & 一些生活雜碎

    1 - Tomcat的類載入器的結構

    Tomcat Server在啟動的時候將構造一個ClassLoader樹,以保證模塊的類庫是私有的
    Tomcat Server的ClassLoader結構如下:

            +-----------------------------+
            |         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,用來在運行時動態地載入其它類
    系統默認的contextClassLoader是systemClassLoader,所以一般而言java程序在執行時可以使用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線程,它的contextClassLoader是WebApp?ClassLoader
    - 對于Tomcat Server線程,它的contextClassLoader是CatalinaClassLoader

    3 - 部分原代碼分析

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

    Tomcat Server線程的起點
    構造ClassLoader樹,并設置Tomcat Server線程的contextClassLoader為catalinaloader
    載入若干類,然后轉入org.apache.catalina.startup.Catalina類中

    [查看代碼]

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

    根據設置創建并返回StandardClassLoader的實例

    [查看代碼]

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

    類載入器

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

    該類僅包含一個靜態方法,用來為catalinaLoader載入一些類

    [查看代碼]

    Appendix - 參考

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

    1 - Tomcat的類載入器的結構

    Tomcat Server在啟動的時候將構造一個ClassLoader樹,以保證模塊的類庫是私有的
    Tomcat Server的ClassLoader結構如下:

            +-----------------------------+
            |         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,用來在運行時動態地載入其它類
    系統默認的contextClassLoader是systemClassLoader,所以一般而言java程序在執行時可以使用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線程,它的contextClassLoader是WebApp?ClassLoader
    - 對于Tomcat Server線程,它的contextClassLoader是CatalinaClassLoader

    3 - 部分原代碼分析

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

    Tomcat Server線程的起點
    構造ClassLoader樹,并設置Tomcat Server線程的contextClassLoader為catalinaloader
    載入若干類,然后轉入org.apache.catalina.startup.Catalina類中

    [查看代碼]

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

    根據設置創建并返回StandardClassLoader的實例

    [查看代碼]

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

    類載入器

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

    該類僅包含一個靜態方法,用來為catalinaLoader載入一些類

    [查看代碼]

    Appendix - 參考

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

    ]]>
    posted on 2005-09-20 15:18 Sung 閱讀(599) 評論(0)  編輯  收藏 所屬分類: Tomcat
    主站蜘蛛池模板: 亚洲va在线va天堂va四虎| 中文字幕精品亚洲无线码一区| 亚洲av无码一区二区三区不卡| 一区二区视频在线免费观看| 亚洲AⅤ无码一区二区三区在线 | 国产在线观看免费视频软件| 久久亚洲2019中文字幕| 福利免费在线观看| 亚洲成人在线网站| 免费成人激情视频| 亚洲国产精品久久久久秋霞小| 日本一线a视频免费观看| 美女羞羞喷液视频免费| 日韩亚洲变态另类中文| 国产永久免费高清在线| 99人中文字幕亚洲区| 精品久久久久国产免费| 亚洲av乱码一区二区三区按摩 | 情人伊人久久综合亚洲| 97在线视频免费播放| 日韩亚洲国产综合高清| 免费中文字幕在线观看| 十八禁在线观看视频播放免费| 亚洲AV人无码综合在线观看| av大片在线无码免费| 国产亚洲成在线播放va| 久久精品国产精品亚洲精品| 91久久成人免费| 美景之屋4在线未删减免费| 亚洲成色www久久网站夜月| 无码国产精品久久一区免费 | 亚洲一区中文字幕久久| 毛片a级毛片免费播放100| 一级特级女人18毛片免费视频| 久久亚洲AV午夜福利精品一区 | 亚洲福利电影一区二区?| 国产乱子伦精品免费无码专区| baoyu116.永久免费视频| 亚洲一区精彩视频| 亚洲精品午夜无码电影网| 三年片在线观看免费观看高清电影|