Tomcat是如何載入類的

wangxiaoming發表於2021-01-01

 

類載入機制

類載入器有兩大類:1.JDK自帶的 2.使用者自定義的

JDK自帶類載入器分成3種:

1.Bootstrap ClassLoader 啟動類載入器: 載入/jre/lib下面的類,特別的 /jre/lib/rt.jar 中包含了 sun.misc.Launcher 類, 而 sun.misc.Launcher$ExtClassLoader 和 sun.misc.Launcher$AppClassLoader 都是 sun.misc.Launcher 的內部類,所以擴充類載入器和系統類載入器都是由啟動類載入器載入的

2.Externsion ClassLoader 擴充套件類載入器:用於載入擴充庫中的類。擴充庫路徑為 <JAVA_HOME>/jre/lib/ext/。實現類為 sun.misc.Launcher$ExtClassLoader

3.System ClassLoader 系統類載入器:用於載入 CLASSPATH 中的類。實現類為 sun.misc.Launcher$AppClassLoad

 

 

雙親委派原則:如果一個類受到了類載入的請求。他首先不會嘗試自己載入這個類,而是把這個類交給父類載入器完成,每個父類載入器也是如此,只有當父類載入器在自己搜尋的範圍類找不到指定的類時,子類載入器才會嘗試自己去載入。

雙親委派原則:解決了各個類載入器的基礎類的統一問題

 

 

 

Tomcat 是如何載入類的?

1. BootStrap 引導類載入器

載入 JVM 啟動所需要的類,

2. ExtClassLoader

載入JVM標準擴充套件類(jre/lib/ext)

3. System 系統類載入器

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

4. Common 通用類載入器

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

5. webapp 應用類載入器

該類載入器會載入位於 WEB-INF/lib下的jar檔案中的class 和 WEB-INF/classes下的class檔案

Tomcat類載入器如下:

 

 

Tomcat 並不是嚴格的按照雙親委派原則載入類的。

1.一個web 容器可能需要部署兩個應用程式,不同的應用程式可能會以來同一個第三方庫的不同版本,不能要求同一個類庫在同一個服務中只有一份。但是要相互隔離。

2. Tomcat 為了實現隔離性,每個 WebClassLoader 載入自己的目錄下的 class 檔案,不會傳遞給父類。

 

Tomcat 不遵循雙親委派機制,那麼如果我自己定義一個惡意的HashMap,會不會有風險呢?

不會有風險,載入 JVM 的Bootstrap 和

Tomcat是個web容器, 那麼它要解決什麼問題: 

1. 一個web容器需要部署多個程式,保證每個應用程式都是獨立的,保證相關隔離。

2.部署在同一個 web 容器中相同的類庫的版本可以共享,假如10個應用程式,要用10分相同的類 載入虛擬機器是不現實的。因此可以採用 sharedLoader 進行類載入。

 

https://www.cnblogs.com/javastack/p/13354545.html

https://www.cnblogs.com/aspirant/p/8991830.html

 

 

相關文章