tomcat隔离webapps

多个webapp使用相同的jvm在同一个tomcat上运行。 有时,一个有内存泄漏的webapp会导致整个jvm崩溃并影响其他webapps。 任何建议如何隔离,而无需使用多个jvm和tomcat

在同一个JVM中,一切都共享相同的内存。 没有系统可以分配单独的池或配额。

如果您的某个应用程序在这方面表现得非常糟糕,那么您唯一能做的就是将它隔离在一个单独的JVM(单独的Tomcat)中。

应用程序是否作为单独的进程运行? 还是同一个?

首先,您应该查看分析以查找内存泄漏https://stackoverflow.com/questions/1716597/java-memory-leak-detection-tools 。

但是,作为内部的快速解决方案,您可以使用Runtime.getRuntime()。totalMemory()来查看正在使用的内存量,如果它超过某个限制,并且您知道哪个应用程序导致了问题,那么您可以重启该应用。

您也可以尝试运行System.gc()这是一种可怕的方法,并且实际上不应该使用它,因为它可以被JVM忽略。

据我所知,简短的回答是:不,它无法完成。 Tomcat为所有正在运行的应用程序使用单个内存空间。

我的下意识反应是你应该修复内存泄漏,而不是试图隔离行为不端的应用程序。 治愈比隔离更好。 由于我不知道你的问题的细节,也许由于某种原因这是不实际的。

您无法在同一JVM中隔离应用程序(尽管您可以执行诸如检测特定应用程序ClassLoader以进行诊断之类的操作)

如果您关心的是管理/配置(而不是总内存消耗),您可以使用catalina.home和catalina.base在同一安装中运行多个Tomcat实例。

JSR 121旨在解决这个问题,但尚未实施。

Java中没有标准系统可以真正隔离Web应用程序使用的内存。

但是,您可以编写一些字节码编织逻辑来跟踪特定应用程序分配的内存量。 如果它超过特定阈值,您可以抛出exception并停止应用程序分配更多内存。 如果您可以跟踪Web应用程序消耗的所有内存,您想要做什么? 你想要实施什么?

请注意,这只能有效地确定Webapp分配了多少内存,而不是系统当前消耗的内存量。 为了获得该度量,您必须对所有对象进行字节编码编织finalize()。 由于finalize()由JVM以尽力而为的方式运行,因此如果系统处于负载状态,这可能无法获得最准确的值。 JVM会优先处理这些终结线程的优先级,即使已清理对象,您的值也永远不会更新。

为了使其更新,现在可以在单个JVM上运行多个应用程序。 应用程序在独立的Java虚拟容器中运行,可以保护您的应用程序免受“嘈杂的邻居”的攻击,并允许您跨应用程序共享资源。 这为Apache Tomcat提供了隔离,弹性和增加的应用程序密度。 从www.elasticat.com下载它NB我为开发这个新JVM的Waratek工作