Tomcat 7 - 无法使 CATALINA_OPTS 堆大小正常工作

Posted

技术标签:

【中文标题】Tomcat 7 - 无法使 CATALINA_OPTS 堆大小正常工作【英文标题】:Tomcat 7 - cannot get CATALINA_OPTS heap size to work 【发布时间】:2013-03-22 15:41:57 【问题描述】:

我在 catalina.sh 中设置 CATALINA_OPTS 但奇怪的是这个值似乎被忽略了。我在一台有 768M RAM 的机器上。以下是重现的步骤

我在启动 Tomcat 之前通过运行 free -m 检查内存。我得到以下内容

    total       used       free     shared    buffers     cached
    768         43        724          0          0         16

我在 catalina.sh 的第一行中设置了 CATALINA_OPTS,如下所示:

export CATALINA_OPTS="-Xms64M -Xmx256M"

然后我使用 ./startup.sh 启动 Tomcat

我通过执行 ps aux | grep tomcat 来检查 Tomcat 是否接受了参数。我得到以下结果,这似乎表明该设置已被读取

root 1164 26.0 6.2 1232968 49116 pts/0 Sl 10:30 0:01 /usr/bin/java -Djava.util.logging.config.file=/usr/share/apache-tomcat-7.0.39/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms64M -Xmx256M -Djava.endorsed.dirs=/usr/share/apache-tomcat-7.0.39/endorsed -classpath /usr/share/apache-tomcat-7.0.39/bin/bootstrap.jar:/usr/share/apache-tomcat-7.0.39/bin/tomcat-juli.jar -Dcatalina.base=/usr/share/apache-tomcat-7.0.39 -Dcatalina.home=/usr/share/apache-tomcat-7.0.39 -Djava.io.tmpdir=/usr/share/apache-tomcat- 7.0.39/temp org.apache.catalina.startup.Bootstrap 启动

我再次运行free -m,但我得到了

       total       used       free     shared    buffers     cached
       768        558        209          0          0         20

这表明使用了 512MB。 我不确定我做错了什么。我也尝试过设置 JAVA_OPTS,但也没有用。

我在 CentOS 6 上使用 JDK7 和 Apache Tomcat 7。

编辑 1:以下是我将 -Xmx 值分别设置为 128 和 64 时的结果

       total       used       free     shared    buffers     cached
       768        432        335          0          0         39

       total       used       free     shared    buffers     cached
       768        366        401          0          0         32

看起来 -Xms 设置根本没有任何效果,并且正在使用超过 -Xmx 设置值的大约 250MB。

这很难解释。这是一个普通的 Tomcat 7 安装,没有安装 webapps(除了默认的)。他们肯定不会占用 250 MB,是吗?

【问题讨论】:

【参考方案1】:

请注意,堆并不是 java 获取的唯一内存块。另外,如果tomcat的启动进程使用超过64M,JVM会很乐意分配更多的内存直到-Xmx值。但这还不是全部——各种堆栈的堆栈占用内存,以及要加载的类。还有 PermGen 内存,它也位于堆内存之上。

查看this article 以获取有关您正在处理的各种内存的更多讨论。考虑到今天的内存价格,升级服务器以获得更多内存可能比担心在此级别上优化应用程序的内存消耗更便宜。

【讨论】:

您好,感谢您的回答。我怎样才能找到占用 250MB 的空间。我虽然 Tomcat 是一个精简的容器,但 250 MB 的未计使用量太多了。 使用 jdk 随附的工具 jconsole 连接到您的流程。这至少会概述分配的资源。它不会在逐字节级别上工作,但会让您对可能分配的内存有更多印象。另外,请记住,Java 进程提供了诸如热点编译器之类的东西,这些东西通常针对长时间运行的进程中的性能进行了优化,而不是针对最小的内存占用。您也许可以停用一些 jvm 功能以换取内存,但首先购买更多内存会更便宜。 PermGen 空间约为 150MB。减半

以上是关于Tomcat 7 - 无法使 CATALINA_OPTS 堆大小正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat 7 无法启动

为啥从 Tomcat 6.0 移植 JBoss-7.2.0 应用程序后无法运行?

无法更改tomcat 7堆大小

Tomcat 7 崩溃后无法启动

Window无法启动本地计算机上的tomcat 7

嵌入的tomcat 7无法正确关闭 ClassNotFoundException ContainerBase$StopChild