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

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

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

    Sung in Blog

               一些技術(shù)文章 & 一些生活雜碎

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

    Tomcat Server在啟動(dòng)的時(shí)候?qū)?gòu)造一個(gè)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/...,它們對(duì)TOMCAT和所有的WEB APP都可見
    - Catalina - 載入$CATALINA_HOME/server/...,它們僅對(duì)TOMCAT可見,對(duì)所有的WEB APP都不可見
    - Shared - 載入$CATALINA_HOME/shared/...,它們僅對(duì)所有WEB APP可見,對(duì)TOMCAT不可見(也不必見)
    - WebApp? - 載入ContextBase?/WEB-INF/...,它們僅對(duì)該WEB APP可見

    2 - ClassLoader的工作原理

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

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

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

    由此可得:
    - 對(duì)于WEB APP線程,它的contextClassLoader是WebApp?ClassLoader
    - 對(duì)于Tomcat Server線程,它的contextClassLoader是CatalinaClassLoader

    3 - 部分原代碼分析

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

    Tomcat Server線程的起點(diǎn)
    構(gòu)造ClassLoader樹,并設(shè)置Tomcat Server線程的contextClassLoader為catalinaloader
    載入若干類,然后轉(zhuǎn)入org.apache.catalina.startup.Catalina類中

    [查看代碼]

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

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

    [查看代碼]

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

    類載入器

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

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

    [查看代碼]

    Appendix - 參考

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

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

    Tomcat Server在啟動(dòng)的時(shí)候?qū)?gòu)造一個(gè)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/...,它們對(duì)TOMCAT和所有的WEB APP都可見
    - Catalina - 載入$CATALINA_HOME/server/...,它們僅對(duì)TOMCAT可見,對(duì)所有的WEB APP都不可見
    - Shared - 載入$CATALINA_HOME/shared/...,它們僅對(duì)所有WEB APP可見,對(duì)TOMCAT不可見(也不必見)
    - WebApp? - 載入ContextBase?/WEB-INF/...,它們僅對(duì)該WEB APP可見

    2 - ClassLoader的工作原理

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

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

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

    由此可得:
    - 對(duì)于WEB APP線程,它的contextClassLoader是WebApp?ClassLoader
    - 對(duì)于Tomcat Server線程,它的contextClassLoader是CatalinaClassLoader

    3 - 部分原代碼分析

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

    Tomcat Server線程的起點(diǎn)
    構(gòu)造ClassLoader樹,并設(shè)置Tomcat Server線程的contextClassLoader為catalinaloader
    載入若干類,然后轉(zhuǎn)入org.apache.catalina.startup.Catalina類中

    [查看代碼]

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

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

    [查看代碼]

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

    類載入器

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

    該類僅包含一個(gè)靜態(tài)方法,用來為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) 評(píng)論(0)  編輯  收藏 所屬分類: Tomcat
    主站蜘蛛池模板: 在线观看亚洲成人| 午夜亚洲AV日韩AV无码大全| 中文字幕免费播放| 亚洲日本在线看片| 成人在线视频免费| 精精国产www视频在线观看免费| 亚洲成在人线av| 全免费a级毛片免费**视频| 久久国产乱子伦精品免费午夜 | 免费a级毛片永久免费| 97在线视频免费公开视频| 99热在线日韩精品免费| 亚洲精品日韩中文字幕久久久| 免费人成激情视频| 中文字幕天天躁日日躁狠狠躁免费| 亚洲精品无AMM毛片| 亚洲AV无一区二区三区久久| 国内自产拍自a免费毛片| 亚洲人6666成人观看| MM131亚洲国产美女久久| www.黄色免费网站| 三年片在线观看免费西瓜视频| 亚洲暴爽av人人爽日日碰| 久久久久亚洲精品成人网小说| 四虎影视在线永久免费观看| 最近中文字幕无免费| 亚洲五月午夜免费在线视频| 中文字幕亚洲精品无码| 永久免费视频v片www| 9420免费高清在线视频| www免费黄色网| 色欲aⅴ亚洲情无码AV蜜桃| 亚洲无码高清在线观看| 成人看的午夜免费毛片| 久久九九AV免费精品| 一级大黄美女免费播放| 亚洲AV香蕉一区区二区三区| 久久久亚洲欧洲日产国码是AV| 亚洲热线99精品视频| 亚洲国产精品一区二区三区久久| 啦啦啦中文在线观看电视剧免费版 |