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

标签 java tomcat heap-memory tomcat7 catalina

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

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

    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 | 检查 Tomcat 是否接受了参数grep 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 start

我再次运行 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 安装,没有安装 web 应用程序(除了默认的)。他们肯定不会占用 250 MB,是吗?

最佳答案

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

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

关于java - Tomcat 7 - 无法使 CATALINA_OPTS 堆大小正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15745590/

相关文章:

java - 如何在jsp中获取img标签中的blob图像

java - Java 中的替换模式

java - Tomcat 不会停止。我该如何调试呢?

c++ - 分配的内存在栈或堆中

java - 如何在我自己的集合上使用 For-Each 循环?

java - 使用 swing 菜单和 menuitem 对象调用类

rest - 如何将swagger-ui与部署在运行在eclipse上的tomcat中的服务一起使用

Tomcat clientAuth ="want"移除请求证书并处理请求

c++ - 为什么我不能重新分配以前在 C++ 堆栈上分配的变量( 'Frame' 的复制赋值运算符被隐式删除)?

c++ - 返回在堆中分配的实例与在堆栈中分配的实例