首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >猫的过度记忆消耗

猫的过度记忆消耗
EN

Server Fault用户
提问于 2011-08-01 18:05:22
回答 1查看 6.5K关注 0票数 7

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

我使用模模查看以下内容:(注意:除大型条目外,我删除了所有条目。499 is条目是Tomcat)

代码语言:javascript
运行
复制
  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包:

代码语言:javascript
运行
复制
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设置为128 m:

代码语言:javascript
运行
复制
JAVA_OPTS="-Djava.awt.headless=true -Xmx128M"

有没有人知道我能做些什么来把内存消耗降低到更合理的程度呢?我不明白为什么JVM和Tomcat一起需要消耗这么多内存。

编辑

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

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

我也尝试过同样的方法,用一个新的.zip下载Tomcat 7 --同样的问题。它使用了740 MB的内存。

我安装了Sun /JDK。内存消耗下降到大约400 MB (从近500 MB下降)。这仍然是更多的内存使用比我想要的!

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

当我运行top时,我得到了这样的信息:

代码语言:javascript
运行
复制
  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将使用更多的内存,但我没想到它会如此之高。我是在一个VM上运行的,它只保证了512 me。

EN

回答 1

Server Fault用户

发布于 2011-08-01 19:45:14

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

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

有人运行一个工具来确定使用了多少内存。该工具的工作方式如下:

  1. 找到每一个可计划的项目(每个线程)。
  2. 看看它能访问多少内存。
  3. 把那个记忆加在一起
  4. 报告金额。

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

这是某些工具如何报告内存的一个缺陷;然而,它并不是一个容易修复的缺陷(因为修复它需要更改一些非常老的(但很重要)工具的输出)。我不想成为改写顶部或ps的人,这会使OS成为非POSIX。

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

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

我曾经有过带有2GB内存(和1GB交换空间)的盒子,报告说,在一个线程特别多的应用程序上使用了大约7GB的内存。

为了更好地理解许多工具如何报告内存,看这儿。如果他们的python代码正在解析其中一个工具的文本,或者从相同的系统调用中获取数据,那么它在过度报告内存中也会出现同样的错误。

票数 2
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/296432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档