2016-11-20 121 views
1

我知道Tomcat在重新部署時可以重新加載.war文件,我不需要殺死Tomcat進程並重新啓動它。我可以刪除.war,等待Tomcat取消部署,然後將新的.war複製到Web路徑。但是,在不重啓Tomcat的情況下進行了許多次微小的更新戰爭之後,Tomcat是否有可能無法有效釋放內存或導致某些性能問題?假設在一個Tomcat實例中只有一個war應用程序。重新部署戰爭時需要重啓tomcat嗎?

回答

2

基本問題是,Java目前不提供在Java Virtual Machine (JVM)中運行的代碼部分之間的任何形式的隔離,其方式與operating system does with processes相同。你可以殺死一個進程而不影響Windows/Linux /等下的其他進程。你所能做的就是確保事物可以被垃圾收集。

對於Tomcat,WAR的處理方式 - 根據various specifications - 要求每個戰爭都有自己的類加載器,負責運行該代碼。當WAR未被部署時,最終的結果應該是該類加載器應該被垃圾收集。

不幸的是,garbage collector只能處理完全未被引用的對象,並且WAR代碼中可能存在大量可以禁止的錯誤錯誤,然後每次重新部署都會導致創建另一個類裝入器並且不會銷燬所以你有內存泄漏。在Tomcat本身內部檢測和解決這些類型的錯誤方面已經付出了很多努力,但如果沒有JVM支持,幾乎不可能做到100%。

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

即使在生產中,您也可以通過VisualVM觀察內存使用情況,以瞭解Tomcat JVM隨時間的變化。

+0

請注意,_developing_一個WAR與_deploying_一個WAR有很大的不同。您的IDE應該完全控制熱部署經常發生的Web容器,而不是 - 通常 - 手動部署。換句話說,這應該發生得比較少。 –

0

是的。要停止Tomcat,部署新的戰爭,然後重新啓動Tomcat,這會更加清潔。缺點是大部分應用程序類默認情況下不會被加載,直到有新的請求進入應用程序,但它不是一個大問題。只是意味着在第一次請求新WAR時啓動幾秒鐘。這就是我們如何在生產中部署戰爭。

還允許我們在日誌中設置健康檢查,如果新的戰爭阻止Tomcat正確啓動,那麼我們回滾戰爭,知道這是一個問題,但這是一個單獨的主題。

停機時間是多少?

這可能是出於你的問題的範圍,但如果你想阻止用戶看到任何停機時間,你會運行Tomcat的多個實例和部署,並重新啓動一次一個。