Tomcat内存消耗过大

Tan*_*ner 7 ubuntu tomcat java

我有一台运行 Ubuntu 11.04 (Natty)(64 位)的新服务器。我从安装openjdk和开始tomcat6。当 Tomcat 服务器启动时,它立即使用480+ MB的内存。这似乎不成比例,我想知道是否有人有办法让 Tomcat 使用200-300 MB(或更少)内存。

我用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 %
Run Code Online (Sandbox Code Playgroud)

此外,您可以看到我安装了哪些 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
Run Code Online (Sandbox Code Playgroud)

Tomcat 的启动脚本设置Xmx128M

JAVA_OPTS="-Djava.awt.headless=true -Xmx128M"
Run Code Online (Sandbox Code Playgroud)

有没有人知道我可以做些什么来将内存消耗降低到更合理的水平?我不明白为什么 JVM 和 Tomcat 一起需要消耗这么多内存。

编辑

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

这让我相信openjdk使用大量内存用于 JVM 存在问题。


我用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
Run Code Online (Sandbox Code Playgroud)

我意识到并期望 64 位机器/JVM 将使用更多内存,但我没想到它会这么高。我在一个只能保证 512MB 的 VM 上运行。

Edw*_*uck 2

---- 编辑以提供示例,因为要点没有出现 ----

进程启动并请求 1 GB 内存。

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

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

  1. 查找每个可调度项目(每个线程)。
  2. 查看它可以访问多少内存。
  3. 将内存添加到一起
  4. 报告总数。

当(希望)明显有八个生成的线程(以及原始进程的线程)都使用相同 GB 的内存时,该工具将报告该进程正在使用 9 GB 内存。

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

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

确保的唯一方法是单独列出进程及其内存消耗,然后读取其中一个线程的内存(就像进程一样列出)。这样您就可以知道应用程序的真实内存消耗情况。如果您依赖为您执行加法的工具,您将高估引用同一共享内存的线程数量实际使用的内存量。

我曾经有过带有 2 GB 内存(和 1 GB 交换区)的盒子报告说,之前某个线程特别密集的应用程序使用了约 7GB 内存。

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