Java tomcat隔离webapps

Java tomcat隔离webapps,java,tomcat,jvm,Java,Tomcat,Jvm,使用同一jvm在同一tomcat上运行的多个webapp。有时,一个存在内存泄漏的webapp会导致整个jvm崩溃并影响其他webapp。有没有建议如何在不需要使用多个jvm和tomcat的情况下隔离应用程序是否作为单独的进程运行?还是同一个 首先,您应该查看分析以查找内存泄漏 但是,作为内部的快速解决方案,您可以使用Runtime.getRuntime().totalMemory()查看内存的使用量,如果内存增长超过某个限制,并且您知道是哪个应用程序导致了问题,则可以重新启动该应用程序 您还可

使用同一jvm在同一tomcat上运行的多个webapp。有时,一个存在内存泄漏的webapp会导致整个jvm崩溃并影响其他webapp。有没有建议如何在不需要使用多个jvm和tomcat的情况下隔离应用程序是否作为单独的进程运行?还是同一个

首先,您应该查看分析以查找内存泄漏

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


您还可以尝试运行System.gc(),这是一种非常糟糕的方法,不应该使用它,因为JVM可能会忽略它。

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


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

据我所知,简短的回答是:不,这是做不到的。Tomcat为所有正在运行的应用程序使用单一内存空间


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

您无法在同一JVM中隔离应用程序(尽管您可以执行一些操作,例如为特定的应用程序类加载器插入仪器以进行诊断)


如果您关心的是管理/配置(而不是总内存消耗),那么您可以使用catalina.home和catalina.base在同一安装下运行多个Tomcat实例。JSR 121就是为了解决这个问题而设计的,但是它还没有实现。

Java中没有标准系统来真正隔离web应用程序使用的内存

然而,您可以编写一些字节码编织逻辑来跟踪特定应用程序分配了多少内存。如果超过特定阈值,您可以抛出异常并停止应用程序分配更多内存。如果可以跟踪web应用程序消耗的所有内存,您想做什么?你想实现什么


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

为了更新这些内容,现在可以在单个JVM上运行多个应用程序。应用程序运行在隔离的java虚拟容器中,保护您的应用程序免受“嘈杂的邻居”的影响,并允许您在应用程序之间共享资源。这为ApacheTomcat提供了隔离、弹性和更高的应用程序密度。请从www.elasticat.com下载。注意:我确实为Waratek工作,他开发了这个新的JVM

@jex,感谢您的回答,但我的问题不是解决内存泄漏问题。我只是想看看是否有可能在同一个tomcat/jvm+1上隔离不同的webapp如果您知道哪个webapp导致了内存泄漏,那么最好在单独的jvm中运行它,这样就可以单独监视它