jvm 如何在 tomcat 和部署的 Java 应用程序之间分配

Posted

技术标签:

【中文标题】jvm 如何在 tomcat 和部署的 Java 应用程序之间分配【英文标题】:How jvm distributes between tomcat and deployed Java applications 【发布时间】:2016-04-10 03:33:52 【问题描述】:

我们使用两个基于 Java 的 Web 应用程序部署了 Tomcat。如果其中一个应用程序在同一个 JVM 中运行,我如何调整其中一个应用程序的性能而不影响另一个应用程序的性能?

【问题讨论】:

【参考方案1】:

您的 tomcat 在 JVM 中与您的两个应用程序一起运行。所有 3 个都在同一个 JVM 中运行。因此,如果您调整 JVM(如最大内存使用量),一切都会受到它的影响。据我所知,没有办法表明您希望将更多资源分配给您的 1 个应用程序。

【讨论】:

为一个应用程序提供更多资源的唯一方法是在不同的 JVM 中运行它。 +1【参考方案2】:

这两个 Web 应用程序部署在同一个 JVM(包括 tomcat)中。因此,tomcat 和两个 Web 应用程序只驻留在一个 JVM 中。这是您当前的场景。

另一方面,如果您想单独调整 Web 应用程序 - 比如在性能等方面,那么最简单的方法是将它们部署在两个不同的主机/机器上。这样,两个 Web 应用程序将在各自的 JVM 中运行,并且彼此完全隔离,并且可以独立调整。注意:您需要根据另一台主机的要求和另一个反向代理的要求来考虑这一点。请参阅下面的 EJP 评论。

如果这不可行,那么您可以启动两个不同的 JVM,每个 JVM 都带有一个 tomcat 和一个 Web 应用程序。这样,您可以分别调整两个 JVM:您可以调整在两个不同 JVM 中单独运行的 tomcat 服务器,您可以尝试使用不同的操作系统资源分配来运行它们等。但这是另一个讨论的相关主题。您将如何实现两个不同的 JVM,分别运行一个 tomcat 和一个 Web 应用程序?为了实现这一点,您使用CATALINA_BASE 方法,其中两个Web 应用程序部署到两个不同位置的“webapps”文件夹。我不会对此进行详细介绍,但会给您一个链接。注意:在这种情况下,您可能还需要反向代理。

使用两种不同的 JVM 方法(两个不同的 java 进程),可以分别调整各自的 JVM。我更喜欢这种方法,因为这样更容易有单独的东西,比如日志配置、重启一个而不影响另一个等等。

由于您在谈论性能,所以我顺便提一下,无论您采取何种方法,请记住,在某些操作系统中,尤其是 linux 中,您可以将 CPU、内存等资源限制或分配给特定进程(在您的情况下为 JVM)。您也可以利用 Docker 等容器来做同样的事情。也许您已经意识到这一点,但为了完整起见,我提一下。

您可以参考:tomcat - CATALINA_BASE and CATALINA_HOME variables

【讨论】:

请注意,在所有情况下,Tomcat 和 Web 应用程序始终共存。有两个 JVM,就有两个 Tomcat,在它们前面需要一个反向代理,或者单独的端口。 @EJP 没错。我已更新以提供更多详细信息。

以上是关于jvm 如何在 tomcat 和部署的 Java 应用程序之间分配的主要内容,如果未能解决你的问题,请参考以下文章

如何修改Tomcat运行时jvm编码

tomcat的搭建和介绍

jvm容器的关系

原创大叔经验分享(71)docker容器中使用jvm工具

Centos7安装JDK+部署Tomcat8

Linux下jvm与tomcat的安全与优化