Tomcat 的類加載機制與 JVM 有何不同

類加載(Class Loading)是 JVM 的一種重要機制,是將字節碼以文件形式加載到內存再經過連接、初始化後,最終形成可以被虛擬機直接使用的Java類型的過程。

Tomcat 的類加載機制與 JVM 有何不同

JVM 類加載機制

JVM類加載採用父類委託機制,如圖,

Tomcat 的類加載機制與 JVM 有何不同

JVM中包括集中類加載器:

  1. BootStrapClassLoader 引導類加載器
  2. ExtClassLoader 擴展類加載器
  3. AppClassLoader 應用類加載器
  4. CustomClassLoader 用戶自定義類加載器

當JVM運行過程中,用戶需要加載某些類時,會按照下面的步驟(父類委託機制):

  1. 用戶自己的類加載器,把加載請求傳給父加載器,父加載器再傳給其父加載器,一直到加載器樹的頂層。
  2. 最頂層的類加載器首先針對其特定的位置加載,如果加載不到就轉交給子類。
  3. 如果一直到底層的類加載都沒有加載到,那麼就會拋出異常ClassNotFoundException。

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

Tomcat 類加載機制

tomcat 的類的加載機制稍有不同,如圖,

Tomcat 的類加載機制與 JVM 有何不同

當tomcat啟動時,會創建幾種類加載器,

1、Bootstrap 引導類加載器

加載JVM啟動所需的類,以及標準擴展類(位於jre/lib/ext下)

2、System 系統類加載器

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

3、Common 通用類加載器

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

4、webapp 應用類加載器

每個應用在部署後,都會創建一個唯一的類加載器。該類加載器會加載位於 WEB-INF/lib下的jar文件中的class 和 WEB-INF/classes下的class文件。

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

  1. 使用bootstrap引導類加載器加載。
  2. 使用system系統類加載器加載。
  3. 使用應用類加載器在WEB-INF/classes中加載。
  4. 使用應用類加載器在WEB-INF/lib中加載。
  5. 使用common類加載器在 lib 目錄中加載。


分享到:


相關文章: