根据 jvm 和 Tomcat 设置堆内存的区别

Difference between setting Heap memory in terms of jvm and Tomcat

我的系统中安装了 Java 8,并且能够从命令行查看和设置 JVM 的初始和最大堆大小。我正在使用 tomcat 7,在学习一些教程时,我找到了一种方法来更改 tomcat 的堆大小以及使用 setenv.bat 文件。

我的问题是以上两件事有何不同? tomcat 的启动脚本或批处理文件使用系统中使用 JAVA_HOME 环境变量安装的 java 8。

如果我的 JVM 堆 space 是 1024 M,我为 tomcat 设置了 512 M 堆 space,这是否意味着我的 tomcat 应用程序最多可以使用JVM 的 1024 M 堆中的 512 M 堆?

内存设置适用于 JVM,而不是 Tomcat

您可以创建一个单独的文件 %CATALINA_HOME%\bin\setenv.bat$CATALINA_HOME/bin/setenv.sh 并将您的环境变量放在那里。

所以我想改为设置 JAVA_OPTS 变量:

set JAVA_OPTS=-Xmx512m

Xmx:

指定内存分配池的最大大小(以字节为单位)。该值必须大于 2MB,是 1024 的倍数。附加字母 k 或 K 以指示千字节,或附加字母 m 或 M 以指示兆字节。 The default value is 64MB。此值的上限在 Solaris 7 和 Solaris 8 SPARC 平台上约为 4000m,在 Solaris 2.6 和 x86 平台上约为 2000m,减去开销量。所以,简单来说,你是说 Java to use Maximum of 1024 MB from available memory.

NOTE: there is NO SPACE between -Xmx and 1024m

资源Link:

  1. 如何更改 Tomcat 的 JVM 堆设置 (-Xms -Xmx) – 配置 setenv.sh 文件 – 运行 catalina.sh
  2. 如何在 Eclipse 中增加 Apache Tomcat HeapSize(JVM 堆)IDE (集成开发环境)避免OutOfMemory

更新 1:设置多个 Tomcat 实例

可以使用 CATALINA_BASE 环境变量创建多个 Tomcat 实例。每个实例都使用通用的二进制分发版,但使用自己的 conf、webapps、temp、logs 和工作目录。每个实例也有自己的 JVM,因此也有自己的内存池。如果您通过 JAVA_OPTS 将最大内存定义为 512MB,则每个实例将尝试分配最大 512MB。

更多详细信息,您可以阅读本教程:Connecting Apache's Web Server to Multiple Instances of Tomcat

资源Link:

  1. 5 运行宁多个实例的场景和最佳实践 Tomcat 或 tc 服务器

通过注册表为 Tomcat 调整 Java 内存的第三种方法

使用 regedit,浏览至

 HKEY_LOCAL_MACHINE > SOFTWARE > Wow6432Node > ApacheSoftwareFoundation >
   Procrun 2.0 > apache-tomcat > Parameters > Java

您可以设置以下键(此处数据值以 MB 为单位):

 JvmMs  REG_DWORD   0x00000400 (1024)
 JvmMx  REG_DWORD   0x00003800 (14336)

在此示例中,Java 虚拟机将始终(特别是 Tomcat)使用至少 1GB 和最多 14GB 的内存。

有趣的是,此设置似乎通过 CATALINA_OPTS(包含 JAVA_OPTS) 重新启动 (Tomcat) 服务时

我在重新启动服务时通过 http://localhost:8080/manager/status(在 JVM 部分)检查了 JVM 的最大内存以观察这一点。

具有有用答案的相关帖子:

  • How to tune Tomcat 5.5 JVM Memory settings without using the configuration program