1. 程式人生 > >圖解Tomcat類載入機制與JVM

圖解Tomcat類載入機制與JVM

  說到本篇的tomcat類載入機制,不得不說翻譯學習tomcat的初衷。

  之前實習的時候學習javaMelody的原始碼,但是它是一個Maven的專案,與我們自己的web專案整合後無法直接斷點除錯。後來同事指導,說是直接把java類複製到src下就可以了。很納悶....為什麼會優先載入src下的java檔案(編譯出的class),而不是jar包中的class呢?

  現在瞭解tomcat的類載入機制,原來一切是這麼的簡單。

類載入

  在JVM中並不是一次性把所有的檔案都載入到,而是一步一步的,按照需要來載入。

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

  因此使用哪種類載入器在什麼位置載入類都是JVM中重要的知識。

JVM類載入

  JVM類載入採用 父類委託機制,如下圖所示:

  JVM中包括集中類載入器:

  1 BootStrapClassLoader 引導類載入器

  2 ExtClassLoader 擴充套件類載入器

  3 AppClassLoader 應用類載入器

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

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

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

):

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

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

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

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

Tomcat類載入

  在tomcat中類的載入稍有不同,如下圖:

  當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

  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類載入器在CATALINA_HOME/lib中載入

問題擴充套件

  通過對上面tomcat類載入機制的理解,就不難明白 為什麼java檔案放在Eclipse中的src資料夾下會優先jar包中的class?

  這是因為Eclipse中的src資料夾中的檔案java以及webContent中的JSP都會在tomcat啟動時,被編譯成class檔案放在 WEB-INF/class 中。

  而Eclipse外部引用的jar包,則相當於放在 WEB-INF/lib 中。

  因此肯定是 java檔案或者JSP檔案編譯出的class優先載入

  通過這樣,我們就可以簡單的把java檔案放置在src資料夾中,通過對該java檔案的修改以及除錯,便於學習擁有原始碼java檔案、卻沒有打包成xxx-source的jar包。

  另外呢,開發者也會因為粗心而犯下面的錯誤。

  在 CATALINA_HOME/lib 以及 WEB-INF/lib 中放置了 不同版本的jar包,此時就會導致某些情況下報載入不到類的錯誤。

  還有如果多個應用使用同一jar包檔案,當放置了多份,就可能導致 多個應用間 出現類載入不到的錯誤。


參考:

相關推薦

圖解Tomcat載入機制JVM

  說到本篇的tomcat類載入機制,不得不說翻譯學習tomcat的初衷。   之前實習的時候學習javaMelody的原始碼,但是它是一個Maven的專案,與我們自己的web專案整合後無法直接斷點除錯。後來同事指導,說是直接把java類複製到src下就可以了。很納悶....為什麼會優先載入src下的

圖解Tomcat載入機制(阿里面試題)

Tomcat的類載入機制是違反了雙親委託原則的,對於一些未載入的非基礎類(Object,String等),各個web應用自己的類載入器(WebAppClassLoader)會優先載入,載入不到時再交給commonClassLoader走雙親委託。  對於JVM來說: 因此,按照這個過程可以想到,如果同樣在CL

圖解Tomcat載入機制

       之前學習javaMelody的原始碼,但是它是一個Maven的專案,與我們自己的web專案整合後無法直接斷點除錯。後來同事指導,說是直接把java類複製到src下就可以了。很納悶....為什麼會優先載入src下的java檔案(編譯出的class),而不是jar包

圖解JVM載入機制載入過程

0、前言 讀完本文,你將瞭解到: 一、為什麼說Jabalpur語言是跨平臺的 二、Java虛擬機器啟動、載入類過程分析 三、類載入器有哪些?其組織結構是怎樣的? 四、雙親載入模型的邏輯和底層程式碼實現是怎樣的? 五、類載入器與Class<T&

JVM原理(二)載入機制GC演算法

一. 類的載入機制 過程 將.class的二進位制資料讀入記憶體,放入方法區中 在堆中建立一個java.lang.Class物件,封裝類在方法區中的資料結構,並提供訪問方法區資料結構的介面 類的生命週期 類的載入過程

jvm載入tomcat載入機制

應用程式在啟動的時候需要啟動虛擬機器進行載入class檔案到記憶體中。然後等待程式的呼叫。那麼有時候我們的程式回報一個錯誤: ClassNotFoundException異常。什麼情況下會報這個異常呢?也許你會說jvm找不到類。但是jvm它是怎麼進行載入的呢?載入的機制是怎麼樣的? jvm採

載入機制反射

一. 類的載入,連線,初始化  1.1. JVM和類當呼叫Java命令執行某個Java程式時,該命令將會啟動一個Java虛擬機器程序。不管Java程式多麼複雜,啟動多少個執行緒,它們都處於該Java虛擬機器程序裡,都是使用同一個Java程序記憶體區。JVM程式終止的方式:程式

《瘋狂Java講義》學習筆記(十四)載入機制反射

1、類的載入、連線和初始化 JVM和類 同一個JVM的所有執行緒、所有變數都處於同一個程序裡,它們都使用該JVM程序的記憶體區 當系統出現一下集中情況時,JVM程序將被終止: 程式執行到最後正常結束 程式執行到使用Sytem.exit()或Runti

《瘋狂Java講義》讀書筆記(十):多執行緒,網路程式設計,載入機制反射

第十六章:多執行緒1、一般而言,程序包含如下3個特徵:獨立性,動態性,併發性。併發性和並行性是兩個概念,並行指同一時刻,有多條指令在多個處理器上同時執行;併發指同一時刻只能有一條指令執行,但多個程序指令

載入機制反射(二)

import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.lang.reflect.Method; import java.util.HashMa

tomcat 載入機制 —— ClassLoader

tomcat 為了做到每個host中都能載入各種不同的WEB應用而不相互影響,採用的類載入機制有所特別: 載入WEB應用中我們自己寫的類的順序也是按照圖中 標示的1243順序所示。    把WebAppClassLoader.java的loadClass方法貼出來瞧瞧:

違反ClassLoader雙親委派機制三部曲第二部——Tomcat載入機制

前言: 本文是基於 ClassLoader雙親委派機制原始碼分析 瞭解過正統JDK類載入機制及其實現原理的基礎上,進而分析這種思想如何應用到Tomcat這個web容器中,從原始碼的角度對 違反ClassLoader雙親委派機制三部曲之首部——JDBC驅動載入 中提出的To

Java核心技術梳理-載入機制反射

一、引言 反射機制是一個非常好用的機制,C#和Java中都有反射,反射機制簡單來說就是在程式執行狀態時,對於任意一個類,能夠知道這個類的所有屬性和方法,對於任意一個物件,能夠呼叫它的任意屬性和方法,其實初聽就知道反射是一個比較暴力的機制,它可能會破壞封裝性。 通過反射的定義我們可以想到反射的好處:可以靈活

JVM 載入機制:編譯器常量初始化

1. 前言 最近在研究JVM虛擬機器類載入機制的時候,我們瞭解到了類載入機制的生命週期以及在準備階段,JVM虛擬機器會對類的靜態變數進行初始化,這個時候只是會將靜態變數初始化為預設的初始值。對靜態變數的定義的初始化值,將會被封裝到clinit()方法中,直到初始化階段進行初始化。但是對於

檔案結構虛擬機器載入機制 JVM筆記3

目錄   平臺無關性 Class類檔案的結構 魔數與Class檔案的版本 常量池 訪問標誌 類索引、父類索引與介面索引集合 欄位表集合 方法表集合 屬性表集合 虛擬機器類載入機制 類載入的時機 類載入的過程 載入 驗證 準備

JVM載入機制詳解(二)載入雙親委派模型

1、通過一個類的全限定名(包名與類名)來獲取定義此類的二進位制位元組流(Class檔案)。而獲取的方式,可以通過jar包、war包、網路中獲取、JSP檔案生成等方式。 2、將這個位元組流所代表

《轉載》圖解Tomcat加載機制

java類 not path 不同 right 定義 目錄 gin 相同 本文轉載自http://www.cnblogs.com/xing901022/p/4574961.html 說到本篇的tomcat類加載機制,不得不說翻譯學習tomcat的初衷。   之前實習的時候學

JVM的虛擬機器載入機制

首先,我們要知道為什麼會存在類的載入機制。Java語言編寫的.java在經過編譯器編譯後會生成.class檔案,這個和C\C++語言是不一樣的。 C語言它們是會被編譯生成為本地機器碼,然後在被執行。這種做法的缺點就是無法完成編寫程式碼的跨平臺使用。想想就知道,windows下編譯好的程式碼在li

jvmjvm載入機制

前言:提到jvm的類載入機制,就不得不說我當年的沙雕經歷了,當年不明白為啥面試官都喜歡問jvm的類載入機制,當時心想學這東西有啥用,它怎麼載入關我啥事呀,能寫程式碼不就好了嗎?但無奈應試教育教會了我,雖然不知道為啥要學,但人家要考,你就得學,然後學唄,學完算是知道它是怎麼載入類的了,但依舊沒能深刻理

JVM系列-載入機制

    簡介   在java中,類的宣告週期總共分為以下幾種: 載入(Loading),驗證(Verification),準備(Preparation),解析(Analysis), 初始化(Initialization),使用(Using),解除安裝(Unloadi