我知道Tomcat在重新部署時可以重新加載.war
文件,我不需要殺死Tomcat進程並重新啓動它。我可以刪除.war
,等待Tomcat取消部署,然後將新的.war
複製到Web路徑。但是,在不重啓Tomcat的情況下進行了許多次微小的更新戰爭之後,Tomcat是否有可能無法有效釋放內存或導致某些性能問題?假設在一個Tomcat實例中只有一個war應用程序。重新部署戰爭時需要重啓tomcat嗎?
1
A
回答
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
是的。要停止Tomcat,部署新的戰爭,然後重新啓動Tomcat,這會更加清潔。缺點是大部分應用程序類默認情況下不會被加載,直到有新的請求進入應用程序,但它不是一個大問題。只是意味着在第一次請求新WAR時啓動幾秒鐘。這就是我們如何在生產中部署戰爭。
還允許我們在日誌中設置健康檢查,如果新的戰爭阻止Tomcat正確啓動,那麼我們回滾戰爭,知道這是一個問題,但這是一個單獨的主題。
停機時間是多少?
這可能是出於你的問題的範圍,但如果你想阻止用戶看到任何停機時間,你會運行Tomcat的多個實例和部署,並重新啓動一次一個。
相關問題
- 1. 蜻蜓戰爭文件重新部署
- 2. 部署戰爭到Tomcat
- 3. 用多重戰爭(野蠻)在EAR戰鬥中重新部署
- 4. OutOfMemory在tomcat上部署戰爭時
- 5. 在Tomcat上的戰爭部署需要年齡
- 6. 如何使用maven-tomcat-plugin在遠程Tomcat 7上重新部署戰爭
- 7. 「GWT模塊在部署到Tomcat中時可能需要(重新編譯)」,並且使用maven生成戰爭
- 8. heroku或cloudfoundry的多重戰爭部署?
- 9. 如何部署Grails戰爭到tomcat
- 10. 用jenkins將戰爭部署到tomcat
- 11. tomcat在webapps之外部署戰爭
- 12. 如何在Tomcat中部署戰爭6
- 13. 在嵌入式Tomcat中部署戰爭
- 14. 部署 「戰爭」 與Tomcat的問題
- 15. 部署戰爭文件的Tomcat錯誤
- 16. 的Tomcat 7的戰爭文件部署
- 17. 使用python向tomcat部署戰爭
- 18. Tomcat中的戰爭部署錯誤
- 19. IntelliJ Tomcat延遲戰爭部署
- 20. 戰爭部署玩
- 21. JBoss戰爭部署
- 22. 更新無需重新部署每次龐大的戰爭文件 - 阿帕奇
- 23. 部署春季啓動戰爭給Tomcat 8
- 24. 應用程序需要在數據庫重新啓動時重新部署
- 25. IntelliJ,在本地主機上部署,無需重新啓動tomcat
- 26. 在Tomcat上部署Grails戰爭需要hsql驅動程序而不是mysql
- 27. os時區更改tomcat需要重啓
- 28. .war重啓競爭條件的部署
- 29. 在Tomcat上更新戰爭
- 30. 在Tomcat中部署Grails戰爭時顯示錯誤
請注意,_developing_一個WAR與_deploying_一個WAR有很大的不同。您的IDE應該完全控制熱部署經常發生的Web容器,而不是 - 通常 - 手動部署。換句話說,這應該發生得比較少。 –