簡體   English   中英

我怎樣才能知道在Tomcat上部署我的WAR這么長時間?

[英]How can I find out what's taking my WAR so long to deploy on Tomcat?

我有一個Web應用程序,通常需要花費大量時間在Tomcat上進行部署。 我懷疑是某個數據庫連接正在等待超時,但這只是一個猜測,我想確定是什么導致了阻塞,所以我可以解決這個問題。 任何人都可以建議我可以這樣做嗎? 我應該在加載WAR時查看Tomcat並查找線索嗎? 如果有,那么某個地方的教程對初學者有好處嗎?

如果這很重要,我的Web應用程序使用Spring和Hibernate。 一位同事告訴我,這可能會導致速度變慢,因為它們非常龐大,以至於某個類加載器正在窒息它需要加載的大量類。

當我停止Tomcat或將WAR熱部署到已經運行的Tomcat時,我也看到了這一點:

Jun 1, 2012 6:03:33 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: The web application [/nacem-rest] registered the JDBC driver [oracle.jdbc.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Jun 1, 2012 6:03:34 PM org.apache.catalina.startup.HostConfig deployWAR

也許這是問題的一部分? 重新部署我的Web應用程序幾乎總是需要重新啟動Tomcat,我一直認為上面提到的JDBC驅動程序問題是罪魁禍首,但也許它也與緩慢的啟動時間有關?

你可以使用一個分析器,但這有點過分。 相反,只需在應用程序加載時進行少量線程轉儲。 您可以使用jstackjvisualvm ,網上有大量資源描述如何執行此操作。 基本上你需要一個Tomcat的PID(參見: jps )。

如果您發現很難分析線程轉儲 - 將其添加到您的問題中。 通常,很容易找到瓶頸。 典型問題:

  • 應用程序嘗試從Internet模式中獲取某些資源
  • 很多類要在CLASSPATH上掃描
  • GC過多(以防萬一gb日志記錄)
  • 沒有足夠的內存(交換,請參閱iostat / iotop

我要看的第一個是在應用程序啟動期間tomcat的CPU或RAM使用情況。

如果你看到很多CPU活動和RAM增加,那么它可能會加載很多東西,比如很多類,或者執行某種巨大的預分配或者類似的東西。 在這種情況下,線程轉儲可以幫助你很多,但也“lsof”(如果您的tomcat在* nix環境中運行),以查看它當前正在處理的文件。

但是,如果你看到它只是坐在那里,那么它可能正在等待某種連接。

正如您所想,一個原因可能是數據庫連接。 數據庫通常可以快速回答,並且連接到數據庫的失敗嘗試通常會在某處清楚地記錄,但它仍然可以。

另一個鮮為人知的原因可能是某些XML驗證。 Web應用程序加載某些XML數據的情況並不少見,使用驗證解析器加載該XML的情況並不少見。 驗證解析器需要模式或DTD來驗證,並且模式/ DTD文件的URL通常包含在XML中。 因此,一些解析器將嘗試從Internet加載模式文件以驗證XML,這可能需要花費大量時間進行Internet連接。 此外,一些解析器將無聲地失敗並且只是在相當長的超時之后不能驗證XML。 很抱歉對“一些解析器”等模糊不清..但是如果XML加載是由webapp中使用的庫完成的,那么他們可以使用JVM XML解析器,任何可能的Xerces版本,JDOM等任何可能的版本......甚至最差的庫可能正在使用不同的解析器。

但是,如果是連接問題,使用“netstat -anlp | grep java”更容易看到它(在你的tomcat中是* nix環境,否則它應該是windows上的“netstat -ano”),並尋找你的tomcat嘗試做什么傳出連接。 在那里,您可以看到數據庫連接以及搜索方案或其他內容的傳出(通常是http)連接。

如果您使用的是Tomcat 7.0.x,則可能是掃描類路徑以檢測注釋。 如果你有很多罐子/類,那么這可能是一個問題。

正如Simone所說,采取和分析幾個線程轉儲是一個很好的開始。

如果您沒有使用最新版本的Tomcat,請嘗試升級並檢查conf / catalina.properties文件,以獲取有關如何減少掃描的jar數量的提示。

您應該在部署期間進行一些線程轉儲(越多越好),並分析它們。 尋找塊,等待等。 線程轉儲分析器可能是有用的。

這可能與JDK的這個BUG有關

讀過這篇文章,Tomcat7在Ubuntu 14.04 x64上啟動太晚並解決了我的問題。

嘗試通過在$ JAVA_PATH / jre / lib / security / java.security中用securerandom.source = file:/ dev /./ urandom 替換 securerandom.source = file:/ dev / urandom來解決它

我發現在將Web應用程序部署到Tomcat8時出現了很大的延遲。 我在WAR中的context.xml文件中配置了三個數據庫連接池。 每個連接池的初始計數為10個連接,因此Tomcat在啟動時創建了30個數據庫連接。 我發現在我的測試系統上為每個池配置1個初始連接可以將部署時間從大約3分鍾提高到22秒。

下面附加在setenv.sh你的工作tomcat7/bin目錄:

JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM