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

Java 根据jvm和Tomcat设置堆内存的区别,java,jvm,tomcat7,Java,Jvm,Tomcat7,我的系统中安装了Java8,可以从命令行查看和设置JVM的初始堆大小和最大堆大小。我正在使用tomcat 7,在阅读一些教程时,我发现了一种方法,可以使用setenv.bat文件更改tomcat的堆大小 我的问题是,上述两件事有何不同?tomcat的启动脚本或批处理文件使用java_HOME环境变量在系统中安装的java 8 如果我的JVM堆空间是1024 M,并且我为tomcat设置了512 M堆空间,这是否意味着我的tomcat应用程序可以从1024 M的JVM堆中使用最多512 M的堆?内

我的系统中安装了Java8,可以从命令行查看和设置JVM的初始堆大小和最大堆大小。我正在使用tomcat 7,在阅读一些教程时,我发现了一种方法,可以使用setenv.bat文件更改tomcat的堆大小

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


如果我的JVM堆空间是1024 M,并且我为tomcat设置了512 M堆空间,这是否意味着我的tomcat应用程序可以从1024 M的JVM堆中使用最多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表示兆字节<代码>默认值为64MB。此值的上限在Solaris 7和Solaris 8 SPARC平台上约为4000m,在Solaris 2.6和x86平台上约为2000m,减去开销。因此,简单地说,您是说
Java使用可用内存的最大1024mb。

注意:
-Xmx
1024m

资源链接:

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

    有关详细信息,您可以浏览本教程:

    资源链接:
  • 通过注册表调整Tomcat Java内存的第三种方法 使用regedit,浏览到

     HKEY_LOCAL_MACHINE > SOFTWARE > Wow6432Node > ApacheSoftwareFoundation >
       Procrun 2.0 > apache-tomcat > Parameters > Java
    
    您可以设置以下键(此处的数据值以MB为单位):

    在本例中,Java虚拟机(尤其是Tomcat)将始终使用至少1GB和高达14GB的内存

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

    在重新启动服务时,我通过(JVM部分)检查了JVM的最大内存,以观察这一点

    有帮助答案的相关帖子:


    我遵循了您共享的第二个链接,所以当我在eclipse中更改tomcat的heap或创建setenv.bat文件并设置heap size参数时,它会在JVM的heap中进行更改,对吗?如果是这样的话,如果我有两个tomcat服务器使用相同的JVM运行,并且我对其中一个tomcat服务器进行堆更改,那么这个更改是否也会影响另一个tomcat服务器呢?请您帮助我理解上述关注。谢谢您的解释。我刚刚被告知,这种方法与调整初始内存池是等效的(对于JVM)和选项卡“Java”上的最大内存池(对于JvmMx),双击tomcat8w.exe(可在Tomcat的相应bin目录中找到)。
     JvmMs  REG_DWORD   0x00000400 (1024)
     JvmMx  REG_DWORD   0x00003800 (14336)