首页 > 解决方案 > 如何防止tomcat中的OutOfMemory异常(限制每个war文件的内存)?

问题描述

如果一个tomcat网络服务器正在运行多个*.war应用程序,并且其中一个应用程序导致OutOfMemory异常,这将关闭整个 tomcat 服务器。

问题:是否可以防止这种情况发生?例如为每个war文件分配一个最大内存限制,这样只有这个应用程序会被关闭(或重新启动)?

标签: javatomcattomcat8

解决方案


不。

Tomcat 在单个 JVM 中运行,Web 应用程序共享内存以及所有其他资源,包括 CPU、线程池、网络 I/O 等。

管理每个 Web 应用程序的内存的最简单解决方案是运行单独的 Tomcat 实例。假设您相应地减少其他资源分配,这样做的内存开销是几十 MB。例如,如果您在线程池中有一个具有 200 个线程的 Tomcat 实例,并且如果您在所有四个实例中分配总共超过 200 个线程,那么您将其拆分为 4 个 Tomcat 实例,那么您将需要更多内存用于额外的线程。

还要记住,您使用资源的效率会降低。在单个实例中,如果一个 Web 应用程序的使用量激增,它可以利用其他 Web 应用程序未使用的资源(例如线程)。如果每个 Web 应用程序都有自己的实例,则不会发生这种情况。这是您为隔离 Web 应用程序所付出的代价。


推荐阅读