无法更改tomcat 7堆大小

Posted

技术标签:

【中文标题】无法更改tomcat 7堆大小【英文标题】:Can't change tomcat 7 heap size 【发布时间】:2011-09-17 21:21:18 【问题描述】:

我通过在catalina.sh中添加以下行来设置tomcat 7的堆大小

export CATALINA_OPTS="-Xms512m -Xmx1024m"

然后停止并启动tomcat。 但是当尝试使用命令 jmap -heap 获取堆大小时,我可以注意到内存没有改变:

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 526385152 (502.0MB)
   NewSize          = 1048576 (1.0MB)
   MaxNewSize       = 4294901760 (4095.9375MB)
   OldSize          = 4194304 (4.0MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 16777216 (16.0MB)
   MaxPermSize      = 67108864 (64.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 99352576 (94.75MB)
   used     = 9643144 (9.196418762207031MB)
   free     = 89709432 (85.55358123779297MB)
   9.705982862487632% used
From Space:
   capacity = 4063232 (3.875MB)
   used     = 0 (0.0MB)
   free     = 4063232 (3.875MB)
   0.0% used
To Space:
   capacity = 5177344 (4.9375MB)
   used     = 0 (0.0MB)
   free     = 5177344 (4.9375MB)
   0.0% used
PS Old Generation
   capacity = 37748736 (36.0MB)
   used     = 21889008 (20.874984741210938MB)
   free     = 15859728 (15.125015258789062MB)
   57.98606872558594% used
PS Perm Generation
   capacity = 60948480 (58.125MB)
   used     = 31496008 (30.03693389892578MB)
   free     = 29452472 (28.08806610107422MB)
   51.67644541750672% used

请指教。

【问题讨论】:

# 的所有注释行之后,您是否在catalina.sh 的开头添加了这个? 某处出现问题,它显示您的 NewSize 在 500 MB 的总堆中为 4000 MB。你在正确的进程上做 jmap 吗? 【参考方案1】:

另外设置export JAVA_OPTS="-Dcom.sun.management.jmxremote"并使用JConsole检查tomcats内存消耗。

【讨论】:

@sword101 它是来自 SUN/Oracle 的诊断工具,它也允许检查 JVM 的内存消耗。 @sword101 您是否不小心将 JAVA_OPTS 环境变量也设置为其他值? 这个答案如何回答这个问题?【参考方案2】:

转到你的 catalina.sh

在开头添加这些行

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 
-server -Xms512m -Xmx1024m
-XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m 
-XX:MaxPermSize=256m -XX:+DisableExplicitGC"

然后使用 startup.sh 启动你的 tomcat

【讨论】:

查看 cherio 的答案。不要更改 catalina.sh。我今天刚升级 tomcat 并恢复了对 catalina.sh 的更改时被这个咬了【参考方案3】:

请勿更改catalina.sh!! 此文件不应由用户更改。 Tomcat 更新可能会覆盖它。而是在“$CATALINA_BASE/bin”(与catalina.sh 相同的文件夹)中创建一个名为“setenv.sh”的文件。在那里设置所有环境变量。

setenv.sh 是一个可选文件。如果存在,则由catalina.sh 导入。这个名字暗示了你放在那里的东西。这是初始化 $CATALINA_OPTS、$JAVA_OPTS 等的合适位置。

附:一般来说,您应该避免调整可以随着提供的包/发行版更新而改变的文件,并且存在替代配置方法。在这种情况下,catalina.sh/etc/tomcat7/tomcat7.conf/etc/init.d/tomcatX 等文件可以静默更新,您甚至不会注意到您的配置更改已回滚。

【讨论】:

【参考方案4】:
sudo vi /etc/default/tomcat7

找到以JAVA_OPTS="-Djava.awt.headless=true开头的行

然后将 -Xmx128m 改成 -Xms512m -Xmx1024m

如果您有多个内核...-XX:+UseConcMarkSweepGC 可能就是您想要的。

【讨论】:

如果您是从 apt-get 安装的,这是正确的答案。无需编辑其他脚本! 或 /etc/tomcat7/tomcat7.conf 如果您使用的是 rpm 发行版。 这在我的 Ubuntu 12.04 上不起作用(通过 apt-get 安装):编辑 /etc/default/tomcat7 had no effect. Editing etc/default/tomcat7` 工作。 这帮了我很多忙,我正在做所有的 OPTS 等等,然后你给我看了这个 omg :) 它甚至无法部署工具...... 即使在今天的 Ubuntu 18.04、Tomcat 8 中,这也是很好的信息。非常感谢。【参考方案5】:

编辑etc/default/tomcat7怎么样

# You may pass JVM startup parameters to Java here. If unset, the default
# options will be: -Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC
#
# Use "-XX:+UseConcMarkSweepGC" to enable the CMS garbage collector (improved
# response time). If you use that option and you run Tomcat on a machine with
# exactly one CPU chip that contains one or two cores, you should also add
# the "-XX:+CMSIncrementalMode" option.
JAVA_OPTS="-Djava.awt.headless=true -Xmx1280m -XX:+UseConcMarkSweepGC"

【讨论】:

在ubuntu上配置tomcat 7堆的最佳位置。 digz6666:想详细说明一下吗? 这是在 ubuntu 中为 tomcat7 配置堆(和日志记录属性等等)的正确位置

以上是关于无法更改tomcat 7堆大小的主要内容,如果未能解决你的问题,请参考以下文章

初始堆大小无效。无法创建Java虚拟机

无法通过 .ebextensions 文件更改 AWS 中的 tomcat 配置

是否可以动态更改最大 Java 堆大小?

更改作为 snap 包安装的 Eclipse 的堆大小

Tomcat 6 堆大小 - 这是正确的吗?

使用嵌入式 Tomcat 启动 Spring Boot 应用程序时如何配置堆大小?