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下的java檔

Tomcat啟動自動載入Servlet

想實現這樣的功能:       1.   Tomcat啟動時隨即啟動Servlet;       2.   Servlet啟動時定時執行一個任務。 要點:       1。Tomcat中啟動Servlet時,只需要在Servlet所在的工程的配置檔案web.x

Tomcat 啟動載入順序

Tomcat啟動時classloader載入順序   Tomcat的class載入的優先順序一覽     1.最先是$JAVA_HOME/jre/lib/ext/下的jar檔案。     2.環境變數CLASSPATH中的jar和class檔案。     3.$CATALINA_HOME/common/cla

Tomcat啟動classloader載入順序

************************************ 1 - Tomcat 的類載入器的結構 Tomcat Server 在啟動的時候將構造一個ClassLoader樹,以保證模組的類庫是私有的 Tomcat Server的ClassLoader結構如下:         +-------

Tomcat啟動時與JVM關係及載入情況

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

Tomcat啟動載入某個servlet

不為 load color col pos ems 項目 設置 應用 當我們做一個java項目時,有幾個功能都須要載入servlet或者實現某個共同的方法,盡管我們一味地在每個功能中依次載入也不是不能夠,可是當某個servlet 或者方法被頻繁地載入和應用。我

Spring專案載入Tomcat啟動載入了兩次

今天開發專案的時候,發現tomcat載入了兩次專案。 先交代一下開發環境: eclipse tomcat 7 首先排查了spring的配置檔案和web.xml檔案是否載入了兩次Spring的容器,但是並沒有發現問題。隨後感覺像是tomcat的問題

spring boot 專案maven打war包,部署Tomcat啟動spring boot未載入,專案訪問404

寫了個restful風格的spring boot專案,maven打成war包後部署Tomcat後,啟動頁面沒有看到spring boot載入的資訊,即控制檯沒有打印出那個大大的spring boot 字串,這是spring boot沒有被容器載入,修改方法如下:@Spring

eclipse中tomcat啟動專案重複載入,導致資源初始化兩次的問題

      在eclise中啟動tomcat發現同一個專案被重複載入了兩次,一直很納悶哪裡出了問題,網上大家各種要去修改appBase之類的方法也不起作用,最後偶然間發現是eclipse中tomcat設定的問題,見圖中: 勾上標紅的選項,就OK了!!!

Tomcat啟動載入資料到快取[web.xml中listener載入順序]

最近用到在Tomcat伺服器啟動時自動載入資料到快取,這就需要建立一個自定義的快取監聽器並實現ServletContextListener介面,並且在此自定義監聽器中需要用到Spring的依賴注入功能.在web.xml檔案中監聽器配置如下: <li

docker+tomcat 啟動非常慢原因之JRE /dev/random阻塞

使用 docker org str 為什麽 操作 ner 環境 random docker+tomcat 啟動時非常慢,一般正常啟動幾十秒的,發現docker+tomcat啟動竟需要幾分鐘,不可思議 根本原因是 SecureRandom 這個 jre 的工具類的問題。那為什

windows下修改tomcat啟動指定的jdk

本機 添加 linu 1.7 jdk1.8 指定 windows tomcat啟動 .com   我本機默認的jdk版本是1.7,裝有tomcat7和tomcat8兩個版本的tomcat。現在是想用tomcat8使用jdk1.8來運行   1.查看tomcat啟動時使用的j

關於Tomcat啟動,長時間停在Initializing Spring root webApplicationContext處的原因

time 現在 cati ack color 處的 問題 style 就會 1.大家肯定經常會遇到這樣的問題,以前啟動tomcat都不會出問題。現在一起動就會卡到Initializing Spring root webApplicationContext處,tomcat會報

Tomcat啟動項目重復加載,導致資源初始化兩次的問題

n) water term clas pps webapps eclips jsb nts 最近在項目開發測試的時候,發現Tomcat啟動時項目重復加載,導致資源初始化兩次的問題 導致該問題的原因: 如下圖:在Eclipse中將Server Locations設置為“Us

JDK8+tomcat8環境tomcat啟動SecureRandom 非常慢解決辦法

啟動tomcat seconds 安全 rom 評估 這就是 gen cal 什麽 JDK 8 + tomcat8 啟動有時會出現 org.apache.catalina.util.SessionIdGeneratorBase- Creation of SecureRand

tomcat啟動非常慢,啟動 一直卡在Root WebApplicationContext: initialization completed

-c 噪音 odin verbose 兩種 xeon 改變 apach localhost 每次重啟自己的服務tomcat都需要卡住很長時間,每次都是日誌停在 Root WebApplicationContext: initialization completed

Tomcat啟動自動運行某程序

指示 timertask 接口 throw time test ref 自定義 pre 項目需要和tmall實現長連接,接收tmall推送的Order消息,然後對消息進行邏輯處理。 目前寫了一個servlet,實現了permit的驗證,然後對tmall進行長連接操作,啟動後

tomcat啟動,內存溢出,Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"

通過 per memory tomcat配置 -xmx ... nbsp ont ron 問題原因   通過tomcat啟動項目,也許是因為項目太大,配置的內存不夠用了。老是報內存溢出的問題。 解決辦法 1.選中項目 右鍵 run as -》Run Configu

Tomcat啟動項目重復加載,導致資源初始化兩次!

ati 解決 class onf dep alt doc ack div 一、現象: 每次啟動Tomcat 的時候,工程會被加載兩次 二、原因: 在tomcat/conf/server.xml配置虛擬目錄引起,如下配置: 我們在Host標簽裏配置了appBase="w

Tomcat 啟動 SecureRandom 非常慢解決辦法,親測有效

1.找到jre—>lib—>security 2.找到      securerandom.source=file:/dev/random 替換成:securerandom.source=file:/dev/./urandom 3.產生這個情況的原因: