五月开心播播网_国内精品伊人久久久久影院对白_亚洲精品高清视频_国产精品激情_68精品久久久久久欧美_四虎免费av_97精品在线视频_欧美知名女优

您的位置:首頁技術文章
文章詳情頁

Tomcat的類加載機制流程及源碼解析

瀏覽:145日期:2023-03-19 16:51:42
目錄
  • 前言
  • 1、Tomcat 的類加載器結構圖:
  • 2、Tomcat 的類加載流程說明:
  • 3、源碼解析:
  • 4、為什么tomcat要實現自己的類加載機制:

前言

在前面 Java虛擬機:對象創建過程與類加載機制、雙親委派模型 文章中,我們介紹了 JVM 的類加載機制以及雙親委派模型,雙親委派模型的類加載過程主要分為以下幾個步驟:

(1)初始化 ClassLoader 時需要指定自己的 parent 是誰

(2)先檢查類是否已經被加載過,如果類已經被加載了,直接返回

(3)若沒有加載則調用父加載器 parent 的 loadClass() 方法進行加載

(4)若父加載器為空則默認使用啟動類加載器 bootstrap ClassLoader 進行加載

(5)如果父類加載失敗,拋出 ClassNotFoundException 異常后,再調用自己的 findClass() 方法進行加載。

前面文章也提到,如果想要破壞這種機制,那么就自定義一個類加載器(繼承自 ClassLoader),并重寫其中的 loadClass() 方法,使其不進行雙親委派即可。最經典例子就是 Tomcat 容器的類加載機制了,它實現了自己的類加載器 WebApp ClassLoader,并且打破了雙親委派模型,在每個應用在部署后,都會創建一個唯一的類加載器。

1、Tomcat 的類加載器結構圖:

(1)Common ClassLoader:加載 common.loader 屬性下的 jar,一般是 CATALINA_HOME/lib 目錄下,主要是 tomcat 使用以及應用通用的一些類

(2)Catalina ClassLoader:加載 server.loader 屬性下的 jar,默認未配置路徑,返回其父加載器即 Common ClassLoader,主要是加載服務器內部可⻅類,這些類應⽤程序不能訪問;

(3)Shared Classloader:加載 share.loader 屬性下的jar,默認未配置路徑,返回其父加載器即 Common ClassLoader,主要是加載應⽤程序共享類,這些類對 Tomcat 自己不可見;

只有指定了 tomcat/conf/catalina.properties 配置文件的 server.loader 和 share.loader 項后,才會真正建立 Catalina ClassLoader 和 Shared ClassLoader 的實例,否則在用到這兩個類加載器的地方都會用 Common ClassLoader 的實例代替,而默認的配置文件中是沒有設置這兩個 loader 項的

(4)WebApp ClassLoader:Tomcat 可以存在多個 WebApp ClassLoader 實例,每個應⽤程序都會有⼀個獨⼀⽆⼆的 WebApp ClassLoader,⽤來加載本應⽤程序 /WEB-INF/classes 和 /WEB-INF/lib 下的類。

2、Tomcat 的類加載流程說明:

當 Tomcat 使用 WebAppClassLoader 進行類加載時,具體過程如下:

(1)先在本地 cache 緩存中查找該類是否已經加載過,看看 Tomcat 有沒有加載過這個類

(2)如果 Tomcat 沒有加載過這個類,則從系統類加載器的 cache 緩存中查找是否加載過

(3)如果沒有,則使用 ExtClassLoader 類加載器類加載,重點來了,Tomcat 的 WebAppClassLoader 并沒有先使用 AppClassLoader 來加載類,而是直接使用了 ExtClassLoader 來加載類。不過 ExtClassLoader 依然遵循雙親委派,它會使用 Bootstrap ClassLoader 來對類進行加載,保證了 Jre 里面的核心類不會被重復加載。

比如在 Web 中加載一個 Object 類。WebAppClassLoader → ExtClassLoader → Bootstrap ClassLoader,這個加載鏈,就保證了 Object 不會被重復加載。

(4)如果沒有加載成功,WebAppClassLoader 就會調用自己的 findClass() 方法由自己來對類進行加載,先在 WEB-INF/classes 中加載,再從 WEB-INF/lib 中加載。

(5)如果仍然未加載成功,WebAppclassLoader 會委派給 SharedClassLoader,SharedClassLoad 再委派給 CommonClassLoader,CommonClassLoader 委派給 AppClassLoader,直到最終委派給 BootstrapClassLoader,最后再一層一層地在自己目錄下對類進行加載。

(6)都沒有加載成功的話,拋出異常。

3、源碼解析:

(1)WebAppClassLoader 的 loadClass() 方法源碼:

WebappClassLoader 應用類加載器的 loadClass 在他的父類 WebappClassLoaderBase 中

public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {    synchronized (getClassLoadingLock(name)) {Class<?> clazz = null;//1. 先在本地cache查找該類是否已經加載過clazz = findLoadedClass0(name);if (clazz != null) {    if (resolve)resolveClass(clazz);    return clazz;}//2. 從系統類加載器的cache中查找是否加載過clazz = findLoadedClass(name);if (clazz != null) {    if (resolve)resolveClass(clazz);    return clazz;}// 3. 嘗試用ExtClassLoader類加載器類加載(ExtClassLoader 遵守雙親委派,ExtClassLoader 會使用 Bootstrap ClassLoader 對類進行加載)ClassLoader javaseLoader = getJavaseClassLoader();try {    clazz = javaseLoader.loadClass(name);    if (clazz != null) {if (resolve)    resolveClass(clazz);return clazz;    }} catch (ClassNotFoundException e) {    // Ignore}// 4. 嘗試在本地目錄搜索class并加載try {    clazz = findClass(name);    if (clazz != null) {if (resolve)    resolveClass(clazz);return clazz;    }} catch (ClassNotFoundException e) {    // Ignore}// 5. 嘗試用系統類加載器(AppClassLoader)來加載try {    clazz = Class.forName(name, false, parent);    if (clazz != null) {if (resolve)    resolveClass(clazz);return clazz;    }} catch (ClassNotFoundException e) {    // Ignore}     }    //6. 上述過程都加載失敗,拋出異常    throw new ClassNotFoundException(name);}

(2)WebAppClassLoader 的 findClass() 方法源碼:

public Class<?> findClass(String name) throws ClassNotFoundException {    // Ask our superclass to locate this class, if possible    // (throws ClassNotFoundException if it is not found)    Class<?> clazz = null;     // 先在自己的 Web 應用目錄下查找 class    clazz = findClassInternal(name);     // 找不到 在交由父類來處理    if ((clazz == null) && hasExternalRepositories) {  clazz = super.findClass(name);    }    if (clazz == null) { throw new ClassNotFoundException(name);    }    return clazz;}

4、為什么tomcat要實現自己的類加載機制:

WebAppClassLoader 加載類的時候,故意打破了JVM 雙親委派機制,繞開了 AppClassLoader,直接先使用 ExtClassLoader 來加載類。最主要原因是保證部署在同一個 Web 容器上的不同 Web 應用程序所使用的類庫可以實現相互隔離,避免不同項目的相互影響。當然還有其他原因,如:

(1)保證 Web 容器自身的安全不受部署的 Web 應用程序影響,所以 Tomcat 使用的類庫要與部署的應用的類庫相互獨立

(2)保證部分基礎類不會被同時加載,有些類庫 Tomcat 與部署的應用可以共享,比如說 servlet-api

(3)保證部署在同一個 Web 容器的應用之間的類庫可以共享,這聽起來好像主要原因相互矛盾,但其實這很合理,類被類加載器加載到虛擬機后,會存放在方法區的永久代中,如果類庫不能共享,虛擬機的方法區就會很容易出現過度膨脹的風險。比如這時候如果有大量的應用使用 spring 來管理,如果 spring 類庫不能共享,那每個應用的 spring 類庫都會被加載一次,將會是很大的資源浪費。

小結:Tomcat 實際上只有 WebAppClassLoader 加載器中打破了雙親委派,其他類加載器還是遵循雙親委派的。 這樣做最主要原因是保證同個 Web 容器中的不同 Web 應用程序所使用的類庫相互獨立,避免相互影響

參考文章:https://www.jb51.net/article/229561.htm

到此這篇關于Tomcat的類加載機制流程及源碼解析的文章就介紹到這了,更多相關Tomcat類加載機制內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: Tomcat
亚洲成人av电影在线| 日韩视频一区在线| 九一成人免费视频| 国产视频精品久久| 亚洲精品成人av久久| 久久69精品久久久久久久电影好| 亚洲欧美日韩国产综合| 亚洲人成免费| 日韩a级作爱片一二三区免费观看| 91导航在线观看| 日韩暖暖在线视频| 欧美一级理论性理论a| 久久久久国产精品麻豆| 亚洲福利国产| 日韩深夜福利| 国产精品久久久久久精| 日批视频在线播放| 免费在线视频观看| 国模精品娜娜一二三区| 高清欧美性猛交xxxx| 亚洲国产精品va在线| 国产精品一二三区在线| 国产美女一区视频| www.色婷婷| 国产小视频在线看| 性一交一黄一片| 日韩第一页在线观看| 国产精品第二页| 日韩欧美在线视频日韩欧美在线视频| 国产精品性做久久久久久| 激情五月***国产精品| 国产黄色一区| 色女人在线视频| 男女视频在线观看| wwwav在线播放| 免费在线视频一区二区| 日韩人妻无码精品综合区| 成人免费网站在线观看| 久久精品亚洲一区| 精品视频一区在线视频| 伊人影院久久| 国产精品videossex| 免费不卡av| 国产91中文| 亚洲成人在线电影| 亚洲天堂精品一区| 日本中文字幕有码| av在线不卡一区| 热久久这里只有精品| 日韩一区二区福利| 在线视频日韩精品| 亚洲丝袜在线视频| 亚洲毛片在线看| 精品国精品国产| 国产视频一区在线播放| 五月激情久久久| 黄页视频在线播放| 777琪琪电影午夜理伦片| 丰满圆润老女人hd| 亚洲a∨一区二区三区| 高清国产在线一区| 亚洲自拍欧美另类| 91久久久一线二线三线品牌| 亚洲精品美女久久| 亚洲第一网中文字幕| 51精品视频一区二区三区| 欧美天堂在线观看| 在线亚洲人成电影网站色www| 色婷婷久久久综合中文字幕| 欧美日韩午夜剧场| 91福利资源站| 日韩欧美中文第一页| 欧美在线观看禁18| 欧美日韩中文国产| 91视频一区二区| 夜久久久久久| 亚洲成人直播| 欧美a级理论片| 国产一区二区伦理片| 日韩精品不卡一区二区| 亚洲破处大片| 日韩在线观看一区二区| 国产乱妇无码大片在线观看| 99国产精品视频免费观看| 亚洲私人影院| 日韩有吗在线观看| 亚洲免费专区| 久久久影院免费| 日韩欧美在线观看一区二区| 女人天堂在线| 黄色在线观看网站| 色是在线视频| 97品白浆高清久久久久久| 欧美疯狂party性派对| 亚洲伊人观看| 不卡av在线免费观看| 亚洲精选视频在线| 99久久er热在这里只有精品15| 国产午夜精品福利| 欧美性20hd另类| 亚洲精品自拍第一页| 国内精品小视频在线观看| 亚洲中国色老太| 国产一区二区91| 葵司免费一区二区三区四区五区| 日本国产精品| 在线日本高清免费不卡| 国产va在线| 青青草原成人在线视频| 国产精品入口免费| 福利视频免费在线观看| 日韩欧美在线一区二区| 国产日韩欧美视频| 欧美综合在线观看| 欧美日韩无遮挡| 国产精品久久国产三级国电话系列 | 久久精品不卡| www.男人的天堂.com| 国产日韩精品suv| 日韩熟女精品一区二区三区| 性生交生活影碟片| 国产小黄视频| h七七www色午夜日本| 丝袜在线视频| 污视频在线观看免费| 污网站在线看| 欧美a一级片| 国产亚洲一区在线| 综合激情成人伊人| 中文字幕日韩欧美一区二区三区| 欧美日韩视频一区二区| 精品国产拍在线观看| 国产亚洲精品自在久久| 亚洲最大天堂网| 日韩一级在线视频| 18以下岁禁止1000部免费| 国产精品r级在线| 精品视频一区二区| 亚洲一区3d动漫同人无遮挡 | 狠狠操在线视频| 欧美激情啪啪| 久久国产精品久久w女人spa| 亚洲欧美日韩电影| 国产91精品免费| 国产欧美日韩精品一区| 亚洲精品国产a久久久久久| 欧美香蕉爽爽人人爽| 亚洲热av色在线播放| 欧美欧美在线| 久久国产人妖系列| 久久精品亚洲麻豆av一区二区 | 国产国产国产国产国产国产| 欧美日韩国产v| 日韩大陆av| 全国精品久久少妇| 91丝袜呻吟高潮美腿白嫩在线观看| 欧美日韩综合在线免费观看| 亚洲**2019国产| 青青草综合在线| 日韩免费黄色片| 午夜精品久久久久久久91蜜桃| 中文字幕永久免费| caoporn超碰97| 一个人看的www日本高清视频| 91美女在线免费观看| 国产乱码精品一区二区三区亚洲人| av成人男女| 欧美片第一页| 日韩在线观看一区 | 国产精品偷伦一区二区| 五月婷婷丁香综合网| 国产精品久久久久久免费免熟| 欧美特级xxxxbbbb毛片| jizz性欧美| 久久成人国产| 欧美v日韩v国产v| 亚洲 日韩 国产第一区| 在线免费观看不卡av| 亚洲a级在线观看| 欧美日韩午夜爽爽| 国产精品美女久久久久av爽| 精品久久久中文字幕人妻| 天堂中文资源在线| 国产精品二区不卡| 色综合天天性综合| 高清av免费一区中文字幕| 亚洲欧美综合7777色婷婷| xxxxwwww在线免费观看| 亚洲电影一区| 一区二区三区在线免费观看| 国产精品精品久久久| 久久天天狠狠| 免费国产成人av| 亚洲欧美日韩综合在线| 成人看片网站| 91精品啪在线观看国产81旧版| 精品久久久久久久久久久久久| 激情久久五月| 亚洲综合丁香婷婷六月香| 一区二区三区视频免费在线观看|