圖解tomcat類載入機制(tomcat7)

笑看風華發表於2018-06-06

圖解tomcat類載入機制(tomcat7

1.1 java類載入器

1.1.1 類載入

在JVM中並不是一次性把所有的檔案都載入,按時按需載入,比如JVM啟動時,會通過不同的類載入器載入不同的類。當使用者在自己的程式碼中,需要某些額外的類時,再通過載入機制載入到JVM中,並且存放一段時間,便於頻繁使用。

1.1.2 什麼是類載入器

類載入器是一個用來載入類檔案的類,java原始碼通過javac編譯器編譯成類檔案,然後JVM來執行類檔案中的位元組碼來執行程式,類載入器負責載入檔案系統、網路或其他 來源的類檔案。有三種預設的類載入器:

  • BootStrap類載入器–載入/jre/lib/rt.jar
  • Extension類載入器– /jre/lib/ext/下的jar包
  • Application類載入器-載入使用者類路徑CLASSPATH下的類

這裡寫圖片描述

下面介紹類的載入順序,例如載入com.xxx.Test

  • 首先由Application類載入器委託給它的父類載入器Extension類載入器,然後再委託給Bootstrap類載入器。
  • BootStrap 類載入器會先看看rt.jar中有沒有這個類,如果沒有這個類,則把這個載入請求返回給Extension類載入器,
  • Extension 類載入器會檢視/jre/lib/ext/目錄下有沒有這個類,如果沒有,則交由Application類載入器處理。
  • Application類載入器從classpath中尋找,如果還是沒有,則報ClassNotFoundException異常

1.2 tomcat類載入器

tomcat類載入器

如上圖所示,tomcat在初始化時建立以下類載入器:

  • Bootstrap 類載入器

    載入JVM啟動所需的類以及標準擴充套件類($JAVA_HOME/jre/lib/ext下)

  • System類載入器

    載入tomcat啟動所需的類,通常在catalina.bat或者catalina.sh中指定。位於CATALINA_HOME/bin下。
    包含一下類:$CATALINA_HOME/bin/bootstrap.jar:tomcat server啟動所需的main方法,
    $CATALINA_BASE/bin/tomcat-juli.jar:日誌介面實現類,包含java.util.loggingAPI 。

  • Common 類載入器

    這個類載入器包含對Tomcat內部類和所有Web應用程式都可見的附加類。 位於 $CATALINA_BASE/lib下

  • webappclassloader

    每個web應用都有一個對應的類載入器例項,該類載入器也使用代理模式,所不同的是它是首先嚐試去載入某個類,如果找不到再代理給父類載入器。這與一般載入器的順序是相反的。這是java servlet規範中的推薦做法,其目的是是的web應用自己的類優先順序高與web容器提供的類。這種代理模式的一個例外是:Java核心庫是不再查詢範圍之內的。這也是為了保證Java核心庫的型別安全。

因此,從web應用程式的角度來看,類或資源載入的順序如下:

  • 使用Bootstrap 載入器載入
  • web application下的/WEB_INF/classes
  • web application下的/WEB_INF/lib/*.jar
  • System類載入器
  • Common類載入器

如果應用程式配置了,則變成一下順序:

  • BootStrap類載入器
  • System類載入
  • Common類載入器
  • web application下的/WEB_INF/classes
  • web application下的/WEB_INF/lib/*.jar

這裡寫圖片描述

相關文章