昨天我发布了这个问题: 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栏中的493m是一个“正常”的东西,还是那个过高? 请记住,现在没有在Tomcat中运行的Web应用程序。 这只是基本的香草安装。
RES列的82米怎么样? 这是什么意思,它与VIRT相比如何? 这是我期望Tomcat使用的内存量。
我的托pipe公司正在使用Parallels Virtuozzo Containers,显然我在内存使用方面提供的统计数据来自某处。 他们告诉我的统计数据是我使用了512MB内存限制(可破解)的110%。 所以实际上他们从Tomcat中算出了400-500MB的内存。
我与您处于相同的情况:使用Parallels Virtuozzo Containers托pipe虚拟服务器。
我安装了Debian 6和Tomcat 7,运行默认应用程序和两个额外的小应用程序。 Tomcat 7的configuration略有改变,但仍然非常类似于默认的configuration:
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的熟悉程度,我个人总是觉得这个FAQ很有用: 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
亲切的问候,克劳德
JVM是一个内存饥饿的环境,512megs可能对于操作系统加上一个jvm运行一个中等大小的应用程序太低。 此外,如果你的目标是如此低的内存消耗,你应该使用OS和JRE的32位版本。 您也可以尝试一个较小的容器,如Jetty。
RES = RES ident大小(您的程序在实际物理内存中的大小。
VIRT = VIRT内存占用(多less虚拟内存,RAM + Swap,你的程序已经分配)。
这是正常的吗? 也许,也许不是。
重新启动tomcat。 VIRTual尺寸是否小得多? 它随着时间增长吗? 如果是这样,你有一个内存泄漏(无论是在Tomcat或在您的应用程序)。
您可以通过挖掘代码来查找泄漏,或通过安排定期重新启动来处理此问题。 前者是正确的方式,后者是快速的方式。
如果您的tomcat进程的虚拟大小在重启之后是相同的,或者增长到一个固定点并且没有变大,那么您没有经典的内存泄漏:您的应用程序只是喜欢使用大量的内存。
您可以重构使用更less的内存,或升级您的主机计划,以使您可以使用更多的内存,而不会超出限制。
既然你说现在没有在Tomcat中运行的应用程序,这可能只是启动时JVM堆的内存Java抓取的默认数量。 该大小是可configuration的(通过Java参数。 请参阅Tomcat用户指南和其他文档的信息)。
我最近得到了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正在使用的真实内存,并且certificate我已经用完了我的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 /环境中,但这没有帮助。
我开始google解决scheme,并遇到年后,至less我并不孤单。
我的j2ee应用程序使用openJPA这也是内存消耗,所以我想我将需要再见256MB。