昨天我发布了这个问题:Tomcat 内存消耗过多
帖子太长太详细了,没人能继续提供帮助。所以现在我要问一个更具体的问题。
当我运行时top
,我得到了这个:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
13749 tomcat6 20 0 493m 82m 9972 S 0 9.0 0:07.34 java
这是在 Ubuntu 11.04 (Nattty) (64 位) 上全新安装的 Tomcat6。
据我了解,VIRT是虚拟内存。VIRT 列中的 493 米是“正常”值吗,还是过高了?请记住,Tomcat 中目前没有运行任何 Web 应用。这只是基本的 vanilla 安装。
RES 列中的 82m 怎么样?这是什么意思?与 VIRT 相比如何?这就是我预计 Tomcat 使用的内存量。
我的托管公司正在使用 Parallels Virtuozzo Containers,显然我获得的内存使用情况统计数据来自那里。他们向我显示的统计数据是,我使用的内存限制为 512MB(可突发)。因此,实际上他们计算的是 Tomcat 的内存价值为 400-500MB。
答案1
我的情况和你一样:使用 Parallels Virtuozzo Containers 托管的虚拟服务器。
我安装了 Debian 6 和 Tomcat 7,运行默认应用程序和另外两个小应用程序。Tomcat 7 配置略有变化,但仍然与默认配置非常相似:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
29910 tomcat 18 0 525m 80m 9972 S 0.0 7.9 0:13.26 java
所以这似乎很正常。我想你已经知道如何使用 JAVA_OPTS='-Xms256m -Xmx256m' 来限制 Tomcat 的内存使用量了?
我不确定您对 Tomcat 有多熟悉,我个人认为这个常见问题解答很有用: http://wiki.apache.org/tomcat/HowTo http://wiki.apache.org/tomcat/HowTo#Where_and_how_do_I_set_memory_related_settings_to_improve_Tomcat_performance.3F
谨致问候,克劳德
答案2
Jvm 是一个内存消耗很大的环境,对于操作系统和运行中型应用程序的 jvm 来说,512MB 可能太低了。另外,如果您的目标是内存消耗如此之低,则应该使用 32 位版本的操作系统和 JRE。您也可以尝试使用占用空间较小的容器,例如 Jetty。
答案3
可再生能源=可再生能源ident 大小(您的程序在实际的物理 RAM 中占多少空间)。
虚拟仿真测试系统=虚拟仿真测试系统ual Memory Footprint(您的程序分配了多少虚拟内存,RAM + Swap)。
这是正常的吗?可能是,也可能不是。
重启 tomcat。虚拟大小是否明显变小?它会随着时间的推移而增长吗?如果是这样,则存在内存泄漏(无论是在 Tomcat 中还是在您的应用程序中)。
您可以通过深入研究代码来查找泄漏,或者安排定期重启来解决这个问题。前者是正确的方法,后者是快捷的方法。
如果 tomcat 进程的虚拟大小在重启后保持不变,或者增长到固定点并且不再变大,则说明没有典型的内存泄漏:您的应用程序只是喜欢使用大量内存。
您可以重构以使用更少的内存,或者升级您的托管计划以允许您使用更多内存而不会超出限制。
由于您说 Tomcat 中目前没有运行任何应用,因此这可能只是 Java 在启动时为 JVM 堆获取的默认内存量。该大小是可配置的(通过 Java 参数)。 请参阅 Tomcat 用户指南以及其他文档以供参考)。
答案4
我最近获得了 392MB 的 VPS,并安装了 Ubuntu 10.04 + Sun JDK 6 + vanilla Tomcat 6.0.32。
当我看到 Tomcat 默认安装占用 384-400 MB 时,我也感到惊讶
root@mybox:# top | grep java
32321 root 18 0 384m 121m 9996 S 0.0 31.7 0:12.24 java
以下脚本确定了 VPS 实际使用的内存,结果显示我的 392Mb 内存不足
#!/bin/bash
bean=`cat /proc/user_beancounters`
guar=`echo "$bean" | grep vmguar | awk '{ print $4;}'`
burst=`echo "$bean" | grep privvm | awk '{ print $5;}'`
priv=`echo "$bean" | grep privvm | awk '{ print $2;}'`
let total=guar/256
let used=priv/256
let burst=burst/256
echo "VPS memory usage:"
echo "Used: $used MB"
echo "Total: $total MB"
echo "Burstable to: $burst MB"
我已将 JAVA_OPTS='-Xms128m -Xmx192m' 放入 /etc/environment 中,但这没有帮助。
我开始用谷歌寻找解决方案,并看到了你的帖子,所以至少我并不孤单。
我的 j2ee 应用程序使用 openJPA,它也消耗内存,所以我认为我需要额外的 256MB。