精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

"深入探索:Tomcat 類加載機制揭秘"

開發 前端
Java 虛擬機將描述類的字節碼數據從 Class 文件加載至內存,并對其進行嚴格的校驗、轉換解析和初始化,最終生成可供虛擬機直接執行的 Java 類型。這一過程便是虛擬機的類加載機制。

前言

在探究 Tomcat 類加載機制之前,讓我們重溫一下 Java 默認的類加載器,加深對其的理解。如同作者在《深入理解 Java 虛擬機》第二版中所言,類加載機制對于理解 Java 運行時環境至關重要。

什么是類加載機制

Java 虛擬機將描述類的字節碼數據從 Class 文件加載至內存,并對其進行嚴格的校驗、轉換解析和初始化,最終生成可供虛擬機直接執行的 Java 類型。這一過程便是虛擬機的類加載機制。

虛擬機設計者將類加載階段中“根據全限定名獲取描述類信息的二進制字節流”這一關鍵步驟委托給了外部實現,賦予應用程序自行決定如何獲取所需類的權利。負責執行這一任務的代碼模塊被稱為“類加載器”。

類與類加載器的關系

類加載器雖然只負責加載類,但其影響卻遠超類加載階段本身。對于任何一個類,它與加載它的類加載器共同決定了該類在 Java 虛擬機中的唯一性,就好比每個類加載器都擁有一個獨立的“類倉庫”,每個倉庫中的類都是獨一無二的。因此,判斷兩個類是否相同,只有在它們由同一個類加載器加載的前提下才有意義。即使兩個類來自同一個 Class 文件,被同一個虛擬機加載,只要加載它們的類加載器不同,它們也必然被視為不同的類。

什么是雙親委任模型

  1. 從 Java 虛擬機的視角來看,類加載器僅存在兩種類型:一是啟動類加載器(Bootstrap ClassLoader),它由 C++語言實現(僅限于 HotSpot 虛擬機),是虛擬機自身的一部分;二是所有其他類加載器,它們均由 Java 語言實現,獨立于虛擬機外部,并且都繼承自抽象類 java.lang.ClassLoader。
  2. 從 Java 開發者的角度,類加載器可以更細致地劃分,大部分 Java 程序員會接觸到以下三種系統提供的類加載器:

啟動類加載器(Bootstrap ClassLoader):它負責加載位于 JAVA_HOME/lib 目錄下的,或者被-Xbootclasspath 參數指定的路徑中的,并且被虛擬機識別的類庫(僅根據文件名識別,例如 rt.jar,其他名字的類庫即使放在 lib 目錄下也不會被重載)。

擴展類加載器(Extension ClassLoader):由 sun.misc.Launcher$ExtClassLoader 實現,它負責加載位于 JAVA_HOME/lib/ext 目錄下的,或由 java.ext.dirs 系統變量指定的路徑中的所有類庫。開發者可以直接使用擴展類加載器。

應用程序類加載器(Application ClassLoader):由 sun.misc.Launcher$AppClassLoader 實現,由于它是 ClassLoader 中的 getSystemClassLoader 方法的返回值,因此也被稱為系統類加載器。它負責加載用戶類路徑(ClassPath)上所指定的類庫。開發者可以直接使用這個類加載器,如果應用程序沒有自定義類加載器,它通常是程序中的默認類加載器。


這些類加載器之間的關系一般如下圖所示:

圖片圖片

圖中各個類加載器之間的關系被稱為類加載器的雙親委派模型(Parents Delegation Mode)。雙親委派模型規定,除了頂層的啟動類加載器之外,其他所有類加載器都應該由其父類加載器加載。這里類加載器之間的父子關系通常不通過繼承實現,而是使用組合關系來復用父加載器的代碼。

類加載器的雙親委派模型在 JDK 1.2 時期被引入,并被廣泛應用于之后的 Java 程序中,但它并非強制性約束模型,而是 Java 設計者推薦給開發者的一種類加載器實現方式。

雙親委派模型的工作流程如下:當一個類加載器收到類加載請求時,它不會立即嘗試加載該類,而是將請求委托給父類加載器處理。每一層級類加載器都遵循這一原則,最終請求將傳遞到頂層的啟動類加載器。只有當父加載器反饋無法完成請求(在其搜索范圍內沒有找到所需的類)時,子加載器才會嘗試自己加載。

為什么要使用雙親委派模型

如果沒有使用雙親委派模型,而是由各個類加載器自行加載類,那么如果用戶編寫了一個名為java.lang.Object的類并將其放置在程序的 ClassPath 中,系統中就會出現多個不同的 Object 類。Java 類型體系中最基礎的行為將無法保證,應用程序也將變得混亂不堪。

雙親委任模型時如何實現的

非常簡單,雙親委派模型的核心邏輯體現在 java.lang.ClassLoader 中的 loadClass 方法中。

圖片圖片

首先判斷若類尚未加載,則委派父加載器嘗試加載。父加載器為空時,則默認委托啟動類加載器。若父加載器加載失敗,則拋出 ClassNotFoundException 異常,隨后調用自定義 findClass 方法進行加載。

如何破壞雙親委任模型

雙親委派模型并非強制性約束,而是 Java 設計者推薦的類加載器實現方式。雖然大部分類加載器都遵循這一模型,但也有例外。迄今為止,雙親委派模型曾三次被“打破”。

第一次發生在雙親委派模型出現之前,即 JDK 1.2 發布之前。

第二次則是模型本身的缺陷所致。雙親委派模型有效地解決了基礎類的統一加載問題(越基礎的類由越上層的加載器加載),然而,并非所有基礎類都只被用戶代碼調用。如果基礎類需要調用用戶代碼,就會出現問題。

這并非不可能。JNDI 服務就是一個典型例子。作為 Java 的標準服務,JNDI 的代碼由啟動類加載器加載(在 JDK 1.3 時就已包含在 rt.jar 中),但它需要調用獨立廠商實現并部署在應用程序 ClassPath 下的 JNDI 接口提供者(SPI,Service Provider Interface)的代碼。然而,啟動類加載器無法“識別”這些代碼,因為它們并不在 rt.jar 中。為了解決這個問題,啟動類加載器需要加載這些代碼。

為了解決這個問題,Java 設計團隊引入了一個名為線程上下文類加載器(Thread Context ClassLoader)的設計。這個類加載器可以通過 java.lang.Thread 類的 setContextClassLoader 方法進行設置。如果在創建線程時尚未設置,它會從父線程中繼承一個;如果在應用程序的全局范圍內都沒有設置,那么這個類加載器默認就是應用程序類加載器。

有了線程上下文加載器,JNDI 服務便可以使用它來加載所需的 SPI 代碼。這相當于父類加載器請求子類加載器完成類加載,打破了雙親委派模型的層次結構,逆向使用類加載器,實際上已經違背了模型的一般性原則。但這是無奈之舉,Java 中所有涉及 SPI 加載的動作基本上都采用這種方式,例如 JNDI、JDBC、JCE、JAXB、JBI 等。

第三次破壞則是為了實現熱插拔、熱部署、模塊化。這意味著添加或刪除功能無需重啟,只需將模塊連同其類加載器一起替換,即可實現代碼熱替換。

Tomcat 的類加載器是怎么設計的

首先,我們來思考個問題:

Tomcat 如果使用默認的類加載機制行不行?

細細想一下,Tomcat 作為一款 Web 容器,其存在的意義何在?到底是為了解決怎樣的問題?

  1. Web 容器或需承載多個應用程序,而不同應用可能依賴于同一第三方類庫的不同版本。為確保應用間相互隔離,每個應用程序的類庫應保持獨立,避免彼此干擾。
  2. 同一 Web 容器中的相同類庫版本可共享,以避免資源浪費。若每個應用程序都獨立加載相同類庫,則當服務器承載十個應用程序時,將會加載十份相同的類庫,這無疑是極不合理的。
  3. Web 容器自身亦有其依賴的類庫,不可與應用程序的類庫混淆。出于安全考慮,容器的類庫與應用程序的類庫應嚴格隔離,互不干擾。
  4. Web 容器需具備對 JSP 文件修改的支持。眾所周知,JSP 文件最終需編譯成 Class 文件才能在虛擬機中運行。然而,程序運行后修改 JSP 文件已成常態,否則容器便無實際意義。因此,Web 容器應支持 JSP 修改后無需重啟服務器,以提高開發效率。

再回頭看問題,Tomcat 如果使用默認的類加載機制行不行?

答案是不行的。為什么?

首先,默認的類加載器機制無法加載相同類庫的不同版本。其機制只關注全限定類名,而不會區分版本。因此,第一個和第三個問題無法通過默認機制解決。

其次,默認類加載器的職責正是確保類庫的唯一性,這與第二個問題并不沖突。

至于第四個問題,熱修改 JSP 文件面臨挑戰。JSP 文件最終編譯成 Class 文件,修改后的 JSP 文件仍擁有相同的類名,導致類加載器直接從方法區中獲取已存在的 Class 文件,無法加載修改后的內容。

為了解決這個問題,可以為每個 JSP 文件創建唯一的類加載器。當 JSP 文件修改后,直接卸載該類加載器,并重新創建類加載器,從而重新加載修改后的 JSP 文件。

Tomcat 如何實現自己獨特的類加載機制

首先看下 Tomcat 的設計圖:

圖片圖片

觀察這張圖,我們看到了多個類加載器,其中除了 JDK 自帶的類加載器之外,我們尤其關注 Tomcat 自身持有的類加載器。細細觀察,我們會發現 Catalina 類加載器和 Shared 類加載器并非父子關系,而是兄弟關系。這種設計背后的緣由,需要我們分析每個類加載器的用途才能明了。

從圖中我們能了解到 Tomcat 類加載器體系結構的設計精妙,每個類加載器各司其職,確保了系統的穩定性和安全性。

  • Common 類加載器 負責加載 Tomcat 和 Web 應用共同復用的類,例如日志框架、通用工具庫等。
  • Catalina 類加載器 專注于加載 Tomcat 自身的類,這些類在 Web 應用中不可見,確保了 Tomcat 核心功能的獨立性。
  • Shared 類加載器 負責加載所有 Web 應用共同復用的類,例如數據庫連接池、緩存框架等,這些類在 Tomcat 中不可見,避免了應用之間的沖突。
  • WebApp 類加載器 為每個 Web 應用單獨創建,負責加載該應用的類,這些類在 Tomcat 和其他應用中不可見,確保了應用之間的隔離。
  • Jsp 類加載器 為每個 JSP 頁面創建唯一的類加載器,方便實現 JSP 頁面的熱插拔,提高開發效率。

至此,我們對 Tomcat 類加載器體系有了初步了解,接下來將深入探討其源碼實現。由于篇幅所限,詳細分析將在下一篇文章中展開。

責任編輯:武曉燕 來源: 碼上遇見你
相關推薦

2024-12-02 09:01:23

Java虛擬機內存

2021-09-24 08:10:40

Java 語言 Java 基礎

2012-01-18 11:24:18

Java

2021-07-05 06:51:43

Java機制類加載器

2023-10-31 16:00:51

類加載機制Java

2024-03-27 10:14:48

2024-09-06 09:37:45

WebApp類加載器Web 應用

2021-01-06 09:01:05

javaclass

2011-02-25 09:23:00

Java類加載器

2024-03-12 07:44:53

JVM雙親委托機制類加載器

2025-07-01 07:41:37

Java類加載器雙親委派

2017-09-20 08:07:32

java加載機制

2023-05-10 11:07:18

2017-03-08 10:30:43

JVMJava加載機制

2021-04-29 11:18:14

JVM加載機制

2024-09-09 09:29:05

2019-12-09 15:08:30

JavaTomcatWeb

2020-10-26 11:20:04

jvm類加載Java

2016-01-14 09:38:55

Java加載器理解

2020-08-31 15:00:17

Node.jsrequire前端
點贊
收藏

51CTO技術棧公眾號

亚洲柠檬福利资源导航| 国精产品一区一区三区mba视频| 亚洲а∨天堂久久精品喷水| 国产一区二区网| 成人影视在线播放| 国产麻豆精品在线观看| 538国产精品视频一区二区| 天天舔天天操天天干| 久久69av| 欧美在线色视频| 欧洲精品视频在线| 欧美女同网站| 国产1区2区3区精品美女| 2024亚洲男人天堂| 一区二区三区影视| 国产成人精品999在线观看| 91精品国产91久久久久久一区二区| 91丨porny丨探花| 午夜免费视频在线国产| 91在线免费视频观看| 国产伊人精品在线| 蜜臀精品一区二区三区| 国产二区精品| 亚洲性猛交xxxxwww| 国产一卡二卡三卡四卡| 日韩成人综合网| 91黄色免费观看| 大陆av在线播放| 黄网页免费在线观看| 久久亚洲春色中文字幕久久久| 91夜夜未满十八勿入爽爽影院| 中文字幕第四页| 亚洲天堂偷拍| 欧美精品在线免费| 一级片黄色录像| 精品毛片免费观看| 日韩黄在线观看| 少妇熟女视频一区二区三区| 欧美亚洲人成在线| 色婷婷综合久久久中文一区二区 | 色中色综合网| 亚洲欧美一区二区三区久久| 精品1卡二卡三卡四卡老狼| 日本一区二区三区中文字幕| 欧美综合一区二区| 欧美激情成人网| 成人午夜视屏| 激情久久av一区av二区av三区| 黄色a级片免费看| 污污片在线免费视频| 一区在线中文字幕| 一区二区免费电影| 在线免费观看黄色| 亚洲国产精华液网站w| 人禽交欧美网站免费| 五月激情婷婷综合| 99久久免费视频.com| 国产一区高清视频| 神马亚洲视频| 成人免费高清在线| 国产一区二区自拍| 免费播放片a高清在线观看| 2020国产精品自拍| 青青草成人激情在线| 国产最新视频在线观看| 国产欧美久久久精品影院| 日韩欧美精品一区二区三区经典| 国产爆初菊在线观看免费视频网站| 久久美女艺术照精彩视频福利播放| 精品日本一区二区三区| 日韩大片b站免费观看直播| 99re这里只有精品6| 你懂的视频在线一区二区| 国产三级视频在线看| 国产精品丝袜在线| 日韩国产精品毛片| 青草av在线| 精品国产乱码久久久久久天美| 国产九九九九九| 超碰aⅴ人人做人人爽欧美| 在线观看不卡视频| 99999精品| 精品三级av在线导航| 亚洲精选在线观看| 国产黄a三级三级| 亚洲小说欧美另类社区| 国产成人综合亚洲| 精品人妻午夜一区二区三区四区| 成人精品视频一区二区三区尤物| 久久精品二区| 国内外激情在线| 无码av中文一区二区三区桃花岛| 熟女少妇精品一区二区| 91成人短视频在线观看| 亚洲第一免费播放区| 国内精品卡一卡二卡三| 欧美大片一区| 日韩美女免费视频| 国产福利小视频| 久久一留热品黄| 4444在线观看| 中文字幕av一区二区三区佐山爱| 3d动漫精品啪啪一区二区竹菊| 久久久久久久人妻无码中文字幕爆| 激情婷婷综合| 欧美国产日韩一区二区| 91麻豆精品在线| 99久久免费精品| www.黄色网址.com| 欧美色999| 亚洲国产成人av在线| 国产福利在线导航| 国产精品日本| 99理论电影网| 日本中文字幕电影在线免费观看| 婷婷成人综合网| 在线视频观看一区二区| 一区二区三区韩国免费中文网站| 欧美华人在线视频| 91亚洲视频在线观看| 337p粉嫩大胆色噜噜噜噜亚洲| 国产又粗又大又爽的视频| 成人h在线观看| 日韩国产中文字幕| 久久一二三四区| 狠狠色丁香婷婷综合| 奇米精品在线| 97成人资源| 日韩毛片在线观看| 国产一级二级毛片| 国产在线精品一区二区不卡了| 涩涩涩999| 香蕉成人av| 亚洲乱亚洲乱妇无码| 国产精品suv一区二区69| 久草中文综合在线| 亚洲精品高清国产一线久久| 婷婷午夜社区一区| 亚洲欧美激情视频| 日韩少妇裸体做爰视频| 成人晚上爱看视频| 中文字幕日韩精品无码内射| 精品成人18| 久久综合88中文色鬼| 97精品久久人人爽人人爽| 亚洲国产精品成人综合色在线婷婷| 免费看的黄色大片| 丝袜美腿综合| 欧美与欧洲交xxxx免费观看| 午夜视频免费在线| 精品成人乱色一区二区| 中文在线永久免费观看| 在线亚洲观看| 欧美三级网色| 亚洲人免费短视频| 中文字幕在线精品| 少妇又紧又色又爽又刺激视频 | 欧美一级特黄高清视频| 美女视频第一区二区三区免费观看网站 | 久久久999久久久| 国产欧美va欧美不卡在线| 国产熟女高潮视频| 狠狠综合久久av一区二区蜜桃 | 日韩欧美国产另类| 国产精品无人区| 在线免费观看av网| 国内精品美女在线观看| 精品福利影视| 欧美最新精品| 久久精品欧美视频| 精品国产99久久久久久宅男i| 亚洲精品免费在线播放| 欧美做受高潮中文字幕| 999在线观看精品免费不卡网站| 久久99精品国产99久久| 欧美xx视频| 久久久www成人免费精品张筱雨| 亚洲精品国产片| 色悠悠久久综合| 黄色一级大片在线免费观看| 成人综合在线视频| 99色精品视频| 911久久香蕉国产线看观看| 99理论电影网| 日韩久久一区二区三区| 久久躁日日躁aaaaxxxx| 无码国产伦一区二区三区视频| 欧美性受xxxx| 精品深夜av无码一区二区老年| 久久综合九色综合97婷婷| 亚洲欧美偷拍另类| 最新日韩欧美| 正义之心1992免费观看全集完整版| 97品白浆高清久久久久久| 欧洲成人免费视频| av在线网址观看| 精品一区二区三区四区在线| 亚洲一区中文字幕在线| 亚洲国产欧美在线| 男女男精品视频网站| 不卡一区中文字幕| 激情五月婷婷基地| 亚洲一区不卡| 日韩精品久久一区二区| 国产亚洲一卡2卡3卡4卡新区| 懂色一区二区三区av片| 97精品国产99久久久久久免费| 欧美大荫蒂xxx| av在线中文| 日韩精品免费观看| 999av视频| 欧美性三三影院| 97超碰人人干| 亚洲欧洲中文日韩久久av乱码| 成年人免费观看视频网站| 高清日韩电视剧大全免费| 波多野结衣xxxx| 奶水喷射视频一区| 国产精品69久久久| 亚洲精品电影| 亚洲乱码一区二区三区 | 日韩电影中文字幕在线观看| va视频在线观看| 欧美日韩一卡二卡三卡 | 精品国产国产综合精品| 久久久久国产精品厨房| 中文文字幕文字幕高清| 国产成人免费视频精品含羞草妖精| 我看黄色一级片| 日韩制服丝袜先锋影音| www.av中文字幕| 在线观看不卡| 欧美国产日韩激情| 国产综合自拍| 永久免费网站视频在线观看| 天天久久综合| 日本黄色播放器| 日韩中文在线电影| 亚洲丰满在线| 日韩中文字幕高清在线观看| 视频一区视频二区视频三区视频四区国产 | 西西人体一区二区| 少妇高潮喷水在线观看| 亚洲精品免费观看| www.av中文字幕| 午夜一区不卡| 日韩av一二三四| 日韩高清一区二区| 欧美一级裸体视频| 青草国产精品久久久久久| 91热这里只有精品| 蜜臀av一级做a爰片久久| 在线观看亚洲色图| 久久国产夜色精品鲁鲁99| 国产色视频在线播放| 精品无人区卡一卡二卡三乱码免费卡| 五月花丁香婷婷| 国产福利不卡视频| 稀缺小u女呦精品呦| 91色乱码一区二区三区| 精品人妻一区二区三区蜜桃视频| 国产亲近乱来精品视频| 波兰性xxxxx极品hd| 亚洲欧美福利一区二区| 国产亚洲第一页| 天天综合色天天综合色h| 怡红院av久久久久久久| 欧美日韩一区精品| 国产成人三级一区二区在线观看一 | 久久久999视频| 日韩成人一级片| 日韩成人av免费| 丁香一区二区三区| 最新中文字幕视频| 国产精品不卡一区二区三区| 黄色一级视频在线观看| 精品日本高清在线播放| 久久久久久无码精品大片| 欧美精品色一区二区三区| www久久久久久| 亚洲男人天堂古典| 黄网站视频在线观看| 久久免费观看视频| 亚洲不卡系列| caoporen国产精品| 亚洲人成网亚洲欧洲无码| 亚洲一区二区免费视频软件合集 | 精品福利一区| 日韩欧美视频第二区| 亚洲色图网站| 亚洲乱码国产一区三区| 国产毛片精品一区| 国产毛片毛片毛片毛片毛片毛片| 中文字幕免费不卡| 国产精品不卡av| 在线不卡中文字幕播放| 亚洲人午夜射精精品日韩| 久久精品人人做人人爽| 丝袜美腿一区| 97在线中文字幕| 久久国产精品亚洲人一区二区三区 | 国产一区二区三区蝌蚪| 天堂久久久久久| 亚洲啪啪综合av一区二区三区| 亚洲精品成人在线视频| 日韩一级二级三级精品视频| 蜜桃成人在线视频| 欧美精品激情在线| 亚洲一区二区av| 欧美日韩一区二区三区免费| 午夜精品影院| 不卡的在线视频| 久久久国际精品| 99视频在线看| 欧美一二三四在线| av网站在线免费观看| 91爱视频在线| 91精品入口| 欧美交换配乱吟粗大25p| 美日韩一区二区三区| 国产精品三级在线观看无码| 亚洲一区欧美一区| 国产精品怡红院| 国产小视频国产精品| 综合久久2023| 精品一卡二卡三卡四卡日本乱码| 韩日精品在线| 无套内谢丰满少妇中文字幕| 国产精品久久久久国产精品日日| 亚洲欧美综合自拍| 亚洲精品自拍视频| 蜜桃视频在线观看免费视频| 国产亚洲欧美另类一区二区三区| 欧美一区免费| 无人码人妻一区二区三区免费| 中文字幕一区二区三区在线观看| 在线观看亚洲黄色| 亚洲丝袜在线视频| 日韩免费va| 日韩成人av电影在线| 久久亚洲视频| 欧美福利第一页| 欧美日韩一区二区三区不卡 | 猛男gaygay欧美视频| 欧美精品一区免费| 91在线精品一区二区| 亚洲另类在线观看| 亚洲人精选亚洲人成在线| 日韩成人动漫| 污视频在线免费观看一区二区三区| 天堂精品中文字幕在线| 精品人妻无码一区| 91成人网在线| 日本最新在线视频| 91人人爽人人爽人人精88v| 亚洲中无吗在线| www男人天堂| 福利一区福利二区微拍刺激| 久久伊伊香蕉| 国产日韩av在线播放| 伊人情人综合网| 在线播放av网址| 黑丝美女久久久| 懂色av中文在线| 91免费看国产| 亚洲国产网站| 欧洲av一区二区三区| 欧美男女性生活在线直播观看| 国产精品一卡二卡三卡| 国产精品久久久久久久久婷婷| 亚洲日韩视频| 欧美 日韩 国产 成人 在线观看| 欧美日韩精品一区视频| 中文字幕在线观看播放| 久久99精品久久久久子伦| 日本伊人午夜精品| 91香蕉视频在线播放| 亚洲第一区在线| 亚洲天堂1区| 大胆欧美熟妇xx| 国产午夜精品久久| 国产欧美一级片| 91精品国产色综合久久不卡98口| av在线不卡顿| 99riav国产精品视频| 色婷婷av一区二区| 国产激情在线| 欧美日韩无遮挡| 国产不卡在线视频| 波多野结衣在线观看一区| 美女福利精品视频| 九九亚洲精品| 日本成人在线免费| 色94色欧美sute亚洲线路一ni| 国产成人在线视频免费观看| 久久综合狠狠综合久久综青草| 国产一区二区三区国产| 久久久国产精品成人免费| 久久精品福利视频| 妖精视频一区二区三区免费观看|