簡體   English   中英

重新部署戰爭時是否需要重新啟動tomcat?

[英]Is it necessary to restart tomcat when redeploy a war?

我知道Tomcat可以在重新部署.war文件時重新加載它,而無需終止Tomcat進程並重新啟動它。 我可以刪除.war ,等待Tomcat取消部署,然后將新的.war復制到Web路徑。 但是,經過多次瑣碎的更新大戰而又沒有重啟Tomcat,Tomcat是否可能無法有效地釋放內存或導致某些性能問題? 假設在一個Tomcat實例中只有一個war應用程序。

基本問題是,Java當前沒有像在操作系統中對進程進行處理的方式那樣,在Java虛擬機(JVM)中運行的代碼部分之間提供任何形式的隔離。 您可以殺死一個進程而不會影響Windows / Linux / etc下的另一個進程。 您所要做的就是確保可以垃圾回收。

對於Tomcat,根據各種規范 ,處理WAR的方式要求每次戰爭都擁有自己的類加載器,該類加載器負責運行該代碼。 取消部署WAR時,最終結果應該是應該垃圾回收該類加載器。

不幸的是, 垃圾收集器只能處理完全未引用的對象,並且WAR代碼中可能存在大量微妙的錯誤,這些錯誤可以阻止這種情況,然后每次重新部署都會導致創建另一個類加載器,並且沒有破壞任何類加載器,因此您已經內存泄漏。 在檢測和解決Tomcat自身內部的此類錯誤方面已經付出了很多努力,但是如果沒有JVM支持,幾乎不可能100%正確地做到這一點。

除了修復WAR之外,唯一的解決方法是重新啟動JVM。

您甚至可以在生產中使用VisualVM監視內存使用情況,以了解隨着時間的推移Tomcat JVM會發生什么。

是。 停止Tomcat,部署新戰爭,然后重新啟動Tomcat更為清潔。 一個缺點是,默認情況下,您的許多應用程序類在新請求打入您的應用程序之前不會加載,但這並不是一個大問題。 只是意味着對您的新WAR的第一個請求需要幾秒鍾的啟動時間。 這就是我們在生產中部署戰爭的方式。

如果新的戰爭阻止了Tomcat正常啟動,還允許我們在日志中設置運行狀況檢查,然后知道有問題就回滾了戰爭,但這就是一個單獨的主題。

那停機時間呢?

這可能不在您的問題范圍內,但是當您要阻止用戶看到任何停機時間時,您將運行多個tomcat實例並一次部署並重新啟動一個實例。

暫無
暫無

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

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