Tomcat过度的内存消耗

我有一台运行Ubuntu 11.04(Natty)(64位)的新服务器。 我开始安装openjdktomcat6 。 当Tomcat服务器启动时,它立即使用480 + MB的内存。 这似乎是不成比例的,我想知道如果有人有一个解决scheme让Tomcat使用200-300 MB (或更less)的内存。

我使用了memtop来看看这个:(注意:我删除了所有大项,499MB项是Tomcat)

  user@xyz:~# python memtop-0.9.py PID | private/writ. mem |command | current | previous |(truncated) 19776 | 499.3 MB | +++++ |/usr/lib/jvm/java-6-openjdk/bin/java-Djava.util.logging.config.file=/var/lib/tomcat6/conf/logging.properties-Djava.awt.headless=true-Xm 18082 | 148.6 MB | +++++ |/usr/sbin/mysqld 1385 | 3.6 MB | ++ |pythonmemtop-0.9.py RAM usage: ============================================== 69.3 % 

而且,你可以看到我安装了什么JDK和Tomcat包:

 user@xyz:~# dpkg --get-selections | grep jdk default-jdk install openjdk-6-jdk install openjdk-6-jre install openjdk-6-jre-headless install openjdk-6-jre-lib install user@xyz:~# dpkg --get-selections | grep tomcat libtomcat6-java install tomcat6 install tomcat6-admin install tomcat6-common install tomcat6-user install 

Tomcat的启动脚本将Xmx设置为128M

 JAVA_OPTS="-Djava.awt.headless=true -Xmx128M" 

有没有人有任何想法,我可以做什么来把内存消耗降低到更合理的东西? 我不明白为什么JVM和Tomcat一起需要消耗这么多的内存。

EDITS

对此,我直接下载了Tomcat 6并运行了启动脚本。 请记住,这次没有设置Xmx值。 运行这个时, memtop显示Tomcat正在使用737 MB的内存!

这导致我相信,使用JVM的大量内存的openjdk存在一个问题。


我尝试了同样的事情,与Tomcat 7新鲜的.zip下载 – 同样的问题。 它使用了740 MB的内存。


我安装了Sun JRE / JDK。 内存消耗下降到400 MB左右(从近500 MB下降)。 这比我更喜欢的内存使用更多!

(sun-java6-bin,sun-java6-jdk,sun-java6-jre)


当我跑top ,我得到这个:

  PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 13749 tomcat6 20 0 481m 68m 9892 S 0 7.4 0:02.85 java 

我意识到并期望64位机器/ JVM将使用更多的内存,但我没有想到它会如此之高。 我在一台只能保证512MB的虚拟机上运行。

—-编辑提供示例,因为点不在—-

一个进程启动并要求1 GB的内存。

该过程然后启动八个线程(都可以访问分配的1 GB内存)。

有人运行一个工具来确定有多less内存正在使用。 该工具的工作原理如下:

  1. find每个可安排的项目(每个线程)。
  2. 看看它可以访问多less内存。
  3. 一起添加内存
  4. 报告总和。

当(希望)显然有8个衍生线程(和原始进程的线程)都使用相同的GB内存时,该工具将报告该进程正在使用9 GB的内存。

这是一些工具如何报告内存的缺陷; 然而,这不是一个容易解决的缺陷(因为修复它将需要改变一些非常老的(但重要的)工具的输出)。 我不想成为重写top或者ps的人,这会使得操作系统不是POSIX。

—-原文如下—-一些版本的内存报告工具(如top)会错误地将线程(都可以访问相同的内存)与进程混淆。 因此,产生五个线程的tomcat实例会错误地报告它的内存消耗五倍。

唯一确定的方法是单独列出内存消耗的进程,然后读取其中一个线程的内存(即像进程一样列出)。 这样你就知道应用程序真正的内存消耗。 如果您依赖于为您添加的工具,那么您将高估由参考相同共享内存的线程数实际使用的内存量。

我已经有了2 GB的内存(和1 GB的交换)的报告,大约7 GB的内存在一个特别重的应用程序之前使用。

为了更好地理解许多工具如何报告内存, 请看这里 。 如果他们的python代码正在parsing这些工具之一的文本,或者从相同的系统调用中获取该数据,那么在过度报告内存中它会受到同样的错误。