我有一个新的服务器运行Ubuntu11.04 (Natty) (64位)。我从安装openjdk
和tomcat6
开始。当Tomcat服务器启动时,它立即使用480+ MB的内存。这似乎不成比例,我想知道是否有人有办法让Tomcat使用200-300 MB (或更少)内存。
我使用模模查看以下内容:(注意:除大型条目外,我删除了所有条目。499 is条目是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
设置为128 m:
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
时,我得到了这样的信息:
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。
发布于 2011-08-01 19:45:14
进程启动并请求1GB内存。
然后,该进程启动八个线程(所有线程都可以访问分配的1GB内存)。
有人运行一个工具来确定使用了多少内存。该工具的工作方式如下:
该工具将报告进程正在使用9 GB内存,当(希望)显然有8个派生线程(以及用于原始进程的线程)都使用相同的GB内存时。
这是某些工具如何报告内存的一个缺陷;然而,它并不是一个容易修复的缺陷(因为修复它需要更改一些非常老的(但很重要)工具的输出)。我不想成为改写顶部或ps的人,这会使OS成为非POSIX。
-一些版本的内存报告工具(如top)错误地将线程(它们都可以访问相同的内存)与进程混淆。因此,生成5个线程的tomcat实例将错误报告其内存消耗5倍。
确保的唯一方法是分别列出进程的内存消耗情况,然后读取其中一个线程的内存(即像进程一样列出)。这样,您就可以知道应用程序的真正内存消耗。如果您依赖于为您进行添加的工具,您将高估引用相同共享内存的线程数量实际使用的内存量。
我曾经有过带有2GB内存(和1GB交换空间)的盒子,报告说,在一个线程特别多的应用程序上使用了大约7GB的内存。
为了更好地理解许多工具如何报告内存,看这儿。如果他们的python代码正在解析其中一个工具的文本,或者从相同的系统调用中获取数据,那么它在过度报告内存中也会出现同样的错误。
https://serverfault.com/questions/296432
复制相似问题