Tomcat類載入機制

來源:互聯網
上載者:User

yahoo中國的一個面試題,轉至水木,希望對大家有用.

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

代碼
1.    Bootstrap  
2.       |            
3.     System   
4.       |  
5.     Common  
6.    /      /  
7.Catalina  Shared  
8.          /    /  
9.       WebApp1  WebApp2  
< type="text/javascript">render_code();
其中:
- 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可見
每個運行中的線程都有一個成員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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.