tomcat隔离webapps

时间:2010-03-19 03:39:11

标签: java tomcat jvm

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

7 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

您无法在同一个JVM中隔离应用程序(尽管您可以执行某些操作,例如检测特定应用程序ClassLoader以进行诊断)

如果您关注的是管理/配置(而不是总内存消耗),那么可以使用catalina.home和catalina.base

在同一安装中运行多个Tomcat实例

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

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