tomcat類載入機制

2021-10-12 12:41:22 字數 1996 閱讀 1919

簡述jvm雙親委派模型:

jvm中包括集中類載入器:

1 bootstrapclassloader 引導類載入器

2 extclassloader 擴充套件類載入器

4 customclassloader 使用者自定義類載入器

他們的區別上面也都有說明。需要注意的是,不同的類載入器載入的類是不同的,因此如果使用者載入器1載入的某個類,其他使用者並不能夠使用。

當jvm執行過程中,使用者需要載入某些類時,會按照下面的步驟(父類委託機制)

1 使用者自己的類載入器,把載入請求傳給父載入器,父載入器再傳給其父載入器,一直到載入器樹的頂層。

2 最頂層的類載入器首先針對其特定的位置載入,如果載入不到就轉交給子類。

3 如果一直到底層的類載入都沒有載入到,那麼就會丟擲異常classnotfoundexception。

因此,按照這個過程可以想到,如果同樣在classpath指定的目錄中和自己工作目錄中存放相同的class,會優先載入classpath目錄中的檔案。

當tomcat啟動時,會建立幾種類載入器:

1 bootstrap 引導類載入器

載入jvm啟動所需的類,以及標準擴充套件類(位於jre/lib/ext下)

2 system 系統類載入器

載入tomcat啟動的類,比如bootstrap.jar,通常在catalina.bat或者catalina.sh中指定。位於catalina_home/bin下。

3 common 通用類載入器

載入tomcat使用以及應用通用的一些類,位於catalina_home/lib下,比如servlet-api.jar

每個應用在部署後,都會建立乙個唯一的類載入器。該類載入器會載入位於 web-inf/lib下的jar檔案中的class 和 web-inf/classes下的class檔案。

當應用需要到某個類時,則會按照下面的順序進行類載入

1 使用bootstrap引導類載入器載入

2 使用system系統類載入器載入

3 使用應用類載入器在web-inf/classes中載入

4 使用應用類載入器在web-inf/lib中載入

5 使用common類載入器在catalina_home/lib中載入

先在本地快取中查詢是否已經載入過該類(對於一些已經載入了的類,會被快取在resourceentries這個資料結構中),如果已經載入即返回,否則 繼續下一步。

前兩步均沒載入到目標類,那麼web應用的類載入器將自行載入,如果載入到則返回,否則繼續下一步。

最後還是載入不到的話,則委託父類載入器(common classloader)去載入。

第3第4兩個步驟的順序已經違反了雙親委託機制,除了tomcat之外,jdbc,jndi,thread.currentthread().setcontextclassloader();等很多地方都一樣是違反了雙親委託。

Tomcat類載入機制

jvm類載入簡單介紹 tomcat類載入參考 jvm類載入簡單介紹 該層次關係稱為類載入器的雙親委派模型,上一層即父載入器。工作流程 如果乙個類載入器收到了類載入的請求,它首先不會自己去嘗試載入這個類,而是把請求委託給父載入器去完成,依次向上,因此,所有的類載入請求最終都應該被傳遞到頂層的啟動類載入...

Tomcat的類載入機制

對於只用於某乙個web應用的類或資源,放在這個web應用下的 web inf classes目錄下,如果是jar,就放在這個web應用下的web inf lib目錄下。對於讓所有的web應用共享的類或資源,放在 catalina base shared classes目錄下,如果是jar,就放在 c...

類載入機制

類的生命週期 乙個類從被載入到記憶體中開始,他的生命週期包括以下幾個階段 類載入時機 類是什麼時候開始載入的?虛擬機器並沒有明確規定,可以由虛擬機器自行實現,但是在類初始化前類必須被載入,虛擬機器明確規定了有且只有5種情況必須進行類的初始化,因此我們也可以理解為類載入的5個時機。使用new關鍵字例項...