查看端口號連接數(shù)
netstat -nat | grep 8080 //查看8080端口的連接數(shù)
查看java進(jìn)程id
ps -ef | grep java
查看進(jìn)程下有多少線程
ps -o nlwp pid //nlwp=number of light weight process
獲取真正在running的線程數(shù)量
ps -eLo pid,stat | grep 27989 | grep running | wc -l //ps -eLo pid,stat是一個命令,可以找出所有線程
tomcat組件分析
層次關(guān)系:
<server> 頂級組件昧狮,位于整個配置的最外層
<service> 容器類組件
<connect/>
<engine>
<host>
<realm/>
<valve/>
<context>
</context>
</host>
<host/>
</engine>
</service>
</server>
server組件:(位于整個配置的最外層)
讓Tomcat啟動一個server實例明场,并監(jiān)聽8005端口以接受shutdown命令(默認(rèn):SHUTDOWN字符)
如果在同一個物理機(jī)上啟動多個server實例,則需要配置不同的端口號
service組件:容器類組件
一個server下可以有多個service
將connector關(guān)聯(lián)至Engine,一個service下只有一個Engine卻可以有多個Connector,每個Connector通過特定的端口和協(xié)議接受請求,并將請求轉(zhuǎn)發(fā)到關(guān)聯(lián)的引擎進(jìn)行處理断盛。
Connector組件:
參數(shù)和實際配置
進(jìn)入tomcat的請求可以根據(jù)tomcat的工作方式分為兩種
1.tomcat作用應(yīng)用程序服務(wù)器,請求來自前端的web服務(wù)器愉舔,這可能是apache,IIS,Nginx等
2.tomcat作為獨立服務(wù)器钢猛,請求來自web瀏覽器
tomcat應(yīng)該考慮工作情形并未相應(yīng)情形下的請求分別定義好需要的連接器才能正確接收來自客戶端的請求,一個engine可以有一個或者多個connector,以適應(yīng)多種請求方式轩缤,
定義連接器時可以配置的屬性非常多命迈,常見如下:
1.address:指鏈接器監(jiān)聽的地址贩绕,默認(rèn)所有地址,即0.0.0.0
2.maxThread:支持最大的連接并發(fā)數(shù)躺翻,默認(rèn)200
3.port:監(jiān)聽的端口丧叽,默認(rèn)為0
4.protocol:連接器使用的協(xié)議,默認(rèn)HTTP/1.1 ,定義AJP協(xié)議時通常為AJP/1.3
5.redirectPort:如果某連接器支持的協(xié)議是HTTP,如果接受到https時公你,則轉(zhuǎn)發(fā)至此屬性定義的端口
6.connectTimeout: 等待客戶端發(fā)送請求的超時時間踊淳,單位ms,默認(rèn)1分鐘
7.enableLookups: 默認(rèn)為true,Web應(yīng)用程序可以通過Web容器提供的request.getRemoteHost()方法獲得訪問Web應(yīng)用客戶的IP地址和名稱陕靠,但是這樣會消耗Web容器的資源迂尝,并且還需要通過IP地址和DNS服務(wù)器反查用戶的名字。因此當(dāng)系統(tǒng)上線時剪芥,可以將這個屬性關(guān)閉垄开,從而減少資源消耗,那么Web應(yīng)用也就只能記錄下IP地址税肪。修改的屬性是enableLoopups="false"
8.acceptCount:設(shè)置等待隊列的最大長度溉躲,通常在tomcat所有等待線程均處于繁忙狀態(tài)時,新發(fā)來的請求將被放置在等待隊列中
下面定義了一個多屬性的SSL連接器:
debug="0" 不啟動調(diào)試模式 益兄;
<Connector port="8443" maxThreads="150" minSpareThreads="25" maxSpareThread="75" enableLookups="false"
acceptCount="100" debug="0" scheme="HTTPs" secure="true" clientAuth="false" sslProtocol="TLS"/>
Engine組件:
Engine是servlet處理器的一個實例,即servlet引擎锻梳,默認(rèn)定義在server.xml中的catalina . engine需要defaultHost屬性來為其定義一個接受所有未明確定義虛擬主機(jī)的請求的host組件,定義如下:
<Engine defaultHost="localhost">
defaultHost:
tomcat支持基于FQDN的虛擬主機(jī)净捅,這些虛擬主機(jī)可以通過在Engine容器中定義不同的host組件來實現(xiàn)疑枯;但是如果引擎收到一個發(fā)往非明確定義的虛擬主機(jī)請求時則需要將此請求發(fā)往一個默認(rèn)的虛擬主機(jī)進(jìn)行處理。因此蛔六,在Engine中定義的多個虛擬主機(jī)host中至少要有一個跟defaultHost定義的主機(jī)名同名
Engine中可以包含Realm荆永、Host、Listener和valve子容器
簡單的Engine配置樣例:
<Engine defaultHost="localhost">
<Host name="localhost" appBase="webapps" unpackWARS="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<context path="" docBase="/ROOT" reloadable="true" crossContext="true"/>
</Host>
</Engine>
Host組件:
位于Engine容器中国章,用于接受請求并進(jìn)行相應(yīng)處理的主機(jī)或虛擬主機(jī)嚷兔,定義如下:
appBase:相對路徑竹挡,相對catalina home路徑
<Host name="localhost" appBase="webapps" unpackWARS="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
context組件
context在某些意義上類似apache中的路徑別名驼鞭,一個context別名用于標(biāo)識tomcat實例中的一個web應(yīng)用程序何陆,如下面的定義:
<context path="" docBase="/web/webapps"/>
<Context path="/bbs" docBase="/web/threads/bbs" reloadable="true"></Context>
<Context path="/chat" docBase="/web/chat"/>
<Context path="/darian" docBase="darian"></Context>
在Tomcat中,每一個context定義也可以使用一個單獨的XML文件進(jìn)行抵碟,其文件的目錄為$CATALINA_HOME/conf/』捣耍可以用于Context中的XML元素有Loader拟逮,Manager,Realm适滓,Resources和WatchedResource敦迄。
常用屬性定義:
1)docBase:相應(yīng)的web程序存放的位置,也可以使用相對路徑,其實路徑為此context所屬Host中appBase定義的路徑罚屋;切記苦囱,docBase的路徑名不能與相應(yīng)host中appBase中定義的路徑名有包含關(guān)系。比如脾猛,appBase為deploy撕彤,而docBase絕對不能為deploy-bbs類的名字
2)path:相對此web服務(wù)器根路徑而言的URI,如果為"",則表示為此webapp的根路徑
3)reloadable:默認(rèn)為false,是否容許重新加載此context相關(guān)的web應(yīng)用程序的類
問題點:在tomcat加載變化代碼的時候有可能會出現(xiàn)內(nèi)存溢出猛拴,tomcat服務(wù)不正常等異常
path和docBase容易混淆:
path是指url訪問的時候設(shè)置的路由羹铅,docBase是指對應(yīng)的url能訪問的資源存放的位置
mac上操作實例:
<Host name="localhost" appBase="www/webapps"
unpackWARs="true" autoDeploy="true">
<Context path="test" docBase="ROOT" reloadable="true"/> <!-- 新增-->
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
說明:
訪問的url:http://localhost:8080/test/
或者h(yuǎn)ttp://localhost:8080 或者 http://localhost:8080/test/index.jsp
index.jsp存放的位置:/Users/penny/download/tomcat/www/webapps/ROOT/index.jsp
docBase:ROOT,相對于所在Host的appBase路徑(www/webapps)
訪問url:localhost:8080/test====localhost:8080+path(Context中的path值)
Cluster
專用于配置Tomcat集群的元素,可用于Engine和Host容器中愉昆。在用于Engine容器中時职员,Engine中的所有Host均支持集群功能。在Cluster元素中跛溉,需要直接定義一個Manager元素焊切,這個Manager元素有一個其值為org.apache.catalina.ha.session.DeltaManager或org.apache.catalina.ha.session.BackupManager的className屬性。同時芳室,Cluster中還需要分別定義一個Channel和ClusterListener元素专肪。
Channel 用于Cluster中給集群中同一組中的節(jié)點定義通信“信道”。Channel中需要至少定義Membership渤愁、Receiver和Sender三個元素牵祟,此外還有一個可選元素Interceptor。
Membership 用于Channel中配置同一通信信道上節(jié)點集群組中的成員情況抖格,即監(jiān)控加入當(dāng)前集群組中的節(jié)點并在各節(jié)點間傳遞心跳信息诺苹,而且可以在接收不到某成員的心跳信息時將其從集群節(jié)點中移除。Tomcat中Membership的實現(xiàn)是org.apache.catalina.tribes.membership.McastService雹拄。
Sender 用于Channel中配置“復(fù)制信息”的發(fā)送器收奔,實現(xiàn)發(fā)送需要同步給其它節(jié)點的數(shù)據(jù)至集群中的其它節(jié)點。發(fā)送器不需要屬性的定義滓玖,但可以在其內(nèi)部定義一個Transport元素坪哄。
Transport 用于Sender內(nèi)部,配置數(shù)據(jù)如何發(fā)送至集群中的其它節(jié)點势篡。Tomcat有兩種Transport的實現(xiàn): 1) PooledMultiSender基于Java阻塞式IO翩肌,可以將一次將多個信息并發(fā)發(fā)送至其它節(jié)點,但一次只能傳送給一個節(jié)點禁悠。 2)PooledParallelSener 基于Java非阻塞式IO念祭,即NIO,可以一次發(fā)送多個信息至一個或多個節(jié)點碍侦。
Receiver 用于Channel定義某節(jié)點如何從其它節(jié)點的Sender接收復(fù)制數(shù)據(jù)粱坤,Tomcat中實現(xiàn)的接收方式有兩種BioReceiver和NioReceiver隶糕。
Tomcat配置文件:
server.xml
context.xml:為部署此tomcat實例上所有的web應(yīng)用程序提供的默認(rèn)配置文件,每個webapp都可以使用獨有的context.xml站玄,通常放置于META-INFO子目錄中枚驻;常用于定義會話管理器、realm以及jdbc等
web.xml
為部署至此tomcat上的所有實例上所有的web應(yīng)用程序提供默認(rèn)部署描述符:通常用于為webapp提供基本的servlet定義和MIME映射表等
通常有2個存放位置:
$CATALINA_BASE/conf/web.xml和每個Web應(yīng)用程序(/WEB-INFO/web.xml)
Tomcat在部署一個應(yīng)用程序時(包括重啟和重新載入)株旷,會首先讀取$CATALINA_BASE/conf/web.xml再登,然后再讀取WEB-INFO/web.xml
catalina.policy:當(dāng)基于-security選項啟動tomcat實例時會讀取此配置文件
catalina.properties:java屬性定義文件,設(shè)定類加載器路徑灾常、安全包列表霎冯、調(diào)整性能的參數(shù)信息
logging.properties:定義日志相關(guān)的配置信息,例如:日志級別钞瀑、文件路徑
webapps體系結(jié)構(gòu):
webapp有特定組織格式沈撞,是一種層次型目錄結(jié)構(gòu);通常包含servlet代碼;jsp頁面文件雕什、類文件缠俺、部署描述符文件等等,一般會打包成格式文檔
/:web應(yīng)用程序的根目錄贷岸,相對于應(yīng)用程序而言壹士,即 ROOT目錄
/WEB-INF:此webapp的私有資源目錄,通常web.xml和context.xml文件均放置于此處
/WEB-INF/classes:此webapp自有的類
/WEB-INF/lib:此webapp自有的能夠被打包成jar格式的類
/META-INF:不同應(yīng)用程序不同
webapp的歸檔格式:
EJB類的歸檔的擴(kuò)展名為.jar
web應(yīng)用程序歸檔擴(kuò)展名為.war
資源適配器類的文件擴(kuò)展名為.rar
企業(yè)級應(yīng)用程序的擴(kuò)展名為.ear
web服務(wù)的擴(kuò)展名為.ear或.war
Tomcat的http連接器:
類型有3種:
1.基于java的http/1.1連接器
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
2.基于java的高性能NIO http/1.1連接器
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true">
3.基于c/c++研發(fā)的native apr http/1.1連接器 <connector port="8080"
<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol" maxThreads="150" SSLEnabled="true" >
從操作系統(tǒng)級別來解決異步的IO問題,大幅度的提高性能.偿警。必須要安裝apr和native躏救,直接啟動就支持apr
兩種代理方式
································································································
LAMT方式:利用apache進(jìn)行反向代理
AJP是為Tomcat與HTTP服務(wù)器之間通信而定制的協(xié)議,能提供較高的通信速度和效率螟蒸。如果tomcat前端放的是apache的時候盒使,會使用到AJP這個連接器
apache(mod_jk,ajp)+tomcat(ajp connector)
apache(mod_proxy,(http,https,ajp))+tomcat(http,https,ajp)
LNMT:利用nginx進(jìn)行反向代理
「
nginx安裝路徑:cd /usr/local/etc/nginx/
一、安裝
執(zhí)行如下命令
brew search nginx
brew install nginx
安裝完以后七嫌,可以在終端輸出的信息里看到一些配置路徑:
/usr/local/etc/nginx/nginx.conf (配置文件路徑)
/usr/local/var/www (服務(wù)器默認(rèn)路徑)
/usr/local/Cellar/nginx/1.8.0 (安裝路徑)
啟動:
目錄:/usr/local/Cellar/nginx/1.15.2/bin
./nginx -c /usr/local/etc/nginx/nginx.conf
停止:
在終端中輸入以下幾種命令都可以停止
kill -QUIT 15800 (從容的停止少办,即不會立刻停止)
Kill -TERM 15800 (立刻停止)
Kill -INT 15800 (和上面一樣,也是立刻停止)
重啟:
在啟動nginx之前诵原,需要先驗證在配置文件的正確性
1. /usr/local/Cellar/nginx/1.8.0/bin/nginx -t -c /usr/local/etc/nginx/nginx.conf
2. ./nginx -s reload
ln -s之后的命令
nginx -t -c /usr/local/ngConfig/nginx.conf 檢查配置
nginx -s reload 重啟
nginx的意義:
在做反向代理時英妓,靜態(tài)內(nèi)容由前端去獲取,動態(tài)內(nèi)容由后端去獲取
#靜態(tài)的文件在/web/htdocs目錄下獲取
location / {
root /web/htdocs;
index index.html index.htm;
#proxy_pass http://127.0.0.1:8080;
}
#jsp绍赛、do結(jié)尾的請求蔓纠,代理到127.0.0.1:8080端口
location ~* /.(jsp|do)$ {
proxy_pass http://127.0.0.1:8080;
}
#jpg|jpeg|exe|gif|rar等文件可以配置到另外一臺服務(wù)器上取
location ~* /.(jpg|jpeg|exe|gif|rar)$ {
proxy_pass http://127.0.0.1:8182;
}
」
nginx+tomcat(http,https)
nginx+tomcat...(多個tomcat)
nginx代理多個tomcat示例如下:
http{
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream tomcat {
server 127.0.0.1:8080;
}
server {
listen 88;
server_name localhost;
location ~* \.(jsp|do)$ {
proxy_pass http://tomcat;
}
}
}
································································································
tomcat會話管理:
manager:
manager對象用于實現(xiàn)http會話管理的功能,tomcat6種有5種會話管理的manager的實現(xiàn):
1.standardManager:
tomcat6的默認(rèn)會話管理吗蚌,用于非集群環(huán)境中對單個處于運行狀態(tài)的tomcat實例進(jìn)行管理腿倚,當(dāng)tomcat關(guān)閉時,這些會話相關(guān)的數(shù)據(jù)會被寫入到磁盤上一個名叫SESSION.ser的文件褪测,并在Tomcat下次啟動時讀取此文件
2.persisentManager:
當(dāng)一個會話長時間處于空閑狀態(tài)時會被寫入到swap會話對象猴誊,這對于內(nèi)存資源比較吃進(jìn)的應(yīng)用比較有用
3.DeltaManager:
用于tomcat集群的管理,它通過將改變了會話數(shù)據(jù)同步給其他節(jié)點實現(xiàn)會話復(fù)制侮措,這種實現(xiàn)會講所有會話的改變同步給集群中每一個節(jié)點懈叹,也是在集群中使用最多的一種實現(xiàn)
4.BackupManager:
將某節(jié)點會話的改變同步給集群中的另一個節(jié)點,而非全部節(jié)點
5.SimpleTcpReplicationManager:
過于老舊
標(biāo)準(zhǔn)會話管理器(standard manager):
<Manager className="org.apache....StandardManager" maxInactiveInterval="7200"/>
默認(rèn)保存在$CATALINA_HOME/work/Catalina/<hostname>/<webapp-name>/下的SESSIONS.ser文件
持久會話管理器(Persisent Manager):
將會話保存至持久存儲中并且能在服務(wù)器意外終止后重新啟動時加載這些會話信息分扎。持久會話管理器容許將會話保存至文件存儲(FIleStore)
或JDBC中
保存至文件中的實例:
<Manager className="org.apache....PersisentManager" maxInactiveInterval="7200" saveOnRestart="true">
<Store ClassName="org.apache...FIleStore" directory="/data/tomcat-serssions"/>
</Manager>
Tomcat連接相關(guān)參數(shù)總結(jié)
在Tomcat配置文件server.xml中的配置中
maxThreads 客戶請求最大線程數(shù)
minSpareThreads Tomcat初始化時創(chuàng)建的 socket 線程數(shù)
maxSpareThreads Tomcat連接器的最大空閑 socket 線程數(shù)
enableLookups 若設(shè)為true, 則支持域名解析澄成,可把 ip 地址解析為主機(jī)名
redirectPort 在需要基于安全通道的場合,把客戶請求轉(zhuǎn)發(fā)到基于SSL 的 redirectPort端口
acceptAccount 監(jiān)聽端口隊列最大數(shù)畏吓,滿了之后客戶請求會被拒絕(不能小于maxSpareThreads )
connectionTimeout 連接超時
minProcessors 服務(wù)器創(chuàng)建時的最小處理線程數(shù)
maxProcessors 服務(wù)器同時最大處理線程數(shù)
URIEncoding URL統(tǒng)一編碼
compression 打開壓縮功能
compressionMinSize 啟用壓縮的輸出內(nèi)容大小墨状,這里面默認(rèn)為2KB
compressableMimeType 壓縮類型
connectionTimeout 定義建立客戶連接超時的時間. 如果為 -1, 表示不限制建立客戶連接的時間
jvm相關(guān)
線程共享內(nèi)存:
方法區(qū):存儲jvm加載的class文件、常量菲饼、靜態(tài)變量肾砂、即時編譯后的代碼等
java堆:存儲java的所有對象的實例、數(shù)組
線程私有內(nèi)存:
程序計數(shù)器:每個線程有一個計數(shù)寄存器宏悦,存放線程運行的字節(jié)碼地址
線程棧:線程私有镐确,線程調(diào)用方法時進(jìn)行入棧和出棧操作;每調(diào)用一個方法則在棧中生成一個新的棧幀
本地方法區(qū):負(fù)責(zé)線程調(diào)用本地方法
jinfo的用法:
jinfo -flags pid 可以看tomcat啟動參數(shù)饼煞,也可以看jvm相關(guān)信息
jinfo -flag <具體某一個參數(shù)> 可以看具體的jvm參數(shù)
jinfo -flag <+/-><name> +:開啟源葫,-:禁用
$CATALINA_BASE/bin/catalina.sh中設(shè)置JAVA_OPTS參數(shù)(jvm運行參數(shù))
遺留問題:
tomcat的類加載,雙親委派等
Tomcat 的類加載器是怎么設(shè)計的砖瞧?
首先息堂,我們來問個問題:
Tomcat 如果使用默認(rèn)的類加載機(jī)制行不行?
我們思考一下:Tomcat是個web容器块促, 那么它要解決什么問題:
- 一個web容器可能需要部署兩個應(yīng)用程序荣堰,不同的應(yīng)用程序可能會依賴同一個第三方類庫的不同版本,不能要求同一個類庫在同一個服務(wù)器只有一份褂乍,因此要保證每個應(yīng)用程序的類庫都是獨立的持隧,保證相互隔離。
- 部署在同一個web容器中相同的類庫相同的版本可以共享逃片。否則屡拨,如果服務(wù)器有10個應(yīng)用程序,那么要有10份相同的類庫加載進(jìn)虛擬機(jī)褥实,這是扯淡的呀狼。
- web容器也有自己依賴的類庫,不能于應(yīng)用程序的類庫混淆损离「缤В基于安全考慮,應(yīng)該讓容器的類庫和程序的類庫隔離開來僻澎。
- web容器要支持jsp的修改貌踏,我們知道十饥,jsp 文件最終也是要編譯成class文件才能在虛擬機(jī)中運行,但程序運行后修改jsp已經(jīng)是司空見慣的事情祖乳,否則要你何用逗堵? 所以,web容器需要支持 jsp 修改后不用重啟眷昆。
再看看我們的問題:Tomcat 如果使用默認(rèn)的類加載機(jī)制行不行蜒秤?
答案是不行的。為什么亚斋?我們看作媚,第一個問題,如果使用默認(rèn)的類加載器機(jī)制帅刊,那么是無法加載兩個相同類庫的不同版本的纸泡,默認(rèn)的累加器是不管你是什么版本的,只在乎你的全限定類名赖瞒,并且只有一份弟灼。第二個問題,默認(rèn)的類加載器是能夠?qū)崿F(xiàn)的冒黑,因為他的職責(zé)就是保證唯一性田绑。第三個問題和第一個問題一樣。我們再看第四個問題抡爹,我們想我們要怎么實現(xiàn)jsp文件的熱修改(樓主起的名字)掩驱,jsp 文件其實也就是class文件,那么如果修改了冬竟,但類名還是一樣欧穴,類加載器會直接取方法區(qū)中已經(jīng)存在的,修改后的jsp是不會重新加載的泵殴。那么怎么辦呢涮帘?我們可以直接卸載掉這jsp文件的類加載器,所以你應(yīng)該想到了笑诅,每個jsp文件對應(yīng)一個唯一的類加載器调缨,當(dāng)一個jsp文件修改了,就直接卸載這個jsp類加載器吆你。重新創(chuàng)建類加載器弦叶,重新加載jsp文件。
Tomcat 如何實現(xiàn)自己獨特的類加載機(jī)制妇多?
所以伤哺,Tomcat 是怎么實現(xiàn)的呢?牛逼的Tomcat團(tuán)隊已經(jīng)設(shè)計好了。我們看看他們的設(shè)計圖
可以看到立莉,前三個加載器和默認(rèn)的一致绢彤,CommonClassLoader、CatalinaClassLoader蜓耻、SharedClassLoader和WebappClassLoader則是Tomcat自己定義的類加載器杖虾,它們分別加載/common/、/server/媒熊、/shared/(在tomcat 6之后已經(jīng)合并到根目錄下的lib目錄下)和/WebApp/WEB-INF/中的Java類庫。其中WebApp類加載器和Jsp類加載器通常會存在多個實例坟比,每一個Web應(yīng)用程序?qū)?yīng)一個WebApp類加載器芦鳍,每一個JSP文件對應(yīng)一個Jsp類加載器。
commonLoader:Tomcat最基本的類加載器葛账,加載路徑中的class可以被Tomcat容器本身以及各個Webapp訪問柠衅;
catalinaLoader:Tomcat容器私有的類加載器,加載路徑中的class對于Webapp不可見籍琳;
sharedLoader:各個Webapp共享的類加載器菲宴,加載路徑中的class對于所有Webapp可見,但是對于Tomcat容器不可見趋急;
WebappClassLoader:各個Webapp私有的類加載器喝峦,加載路徑中的class只對當(dāng)前Webapp可見;
從圖中的委派關(guān)系中可以看出:
CommonClassLoader能加載的類都可以被Catalina ClassLoader和SharedClassLoader使用呜达,從而實現(xiàn)了公有類庫的共用谣蠢,而CatalinaClassLoader和Shared ClassLoader自己能加載的類則與對方相互隔離。
WebAppClassLoader可以使用SharedClassLoader加載到的類查近,但各個WebAppClassLoader實例之間相互隔離眉踱。
而JasperLoader的加載范圍僅僅是這個JSP文件所編譯出來的那一個.Class文件,它出現(xiàn)的目的就是為了被丟棄:當(dāng)Web容器檢測到JSP文件被修改時霜威,會替換掉目前的JasperLoader的實例谈喳,并通過再建立一個新的Jsp類加載器來實現(xiàn)JSP文件的HotSwap功能
如果tomcat的common classLoad 想加載web ClassLoad中的類該怎么辦?
因此引入了線程上下文類加載器(Thread Context ClassLoader)戈泼。
這個類加載器可以通過java.lang.Thread類的setContextClassLoader方法進(jìn)行設(shè)置婿禽。
如果創(chuàng)建線程時還未設(shè)置,它將會從父線程中繼承一個大猛,如果在應(yīng)用程序的全局范
圍內(nèi)都沒有設(shè)置過多的話谈宛,那這個類加載器默認(rèn)即使應(yīng)用程序類加載器。