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 的启动脚本设置Xmx
为128M:
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 上运行。
---- 编辑以提供示例,因为要点没有出现 ----
进程启动并请求 1 GB 内存。
然后该进程启动八个线程(所有线程都可以访问分配的 1 GB 内存)。
有人运行一个工具来确定正在使用多少内存。该工具的工作原理如下:
当(希望)明显有八个生成的线程(以及原始进程的线程)都使用相同 GB 的内存时,该工具将报告该进程正在使用 9 GB 内存。
这是某些工具报告内存方式的缺陷;然而,它不是一个容易修复的缺陷(因为修复它需要更改一些非常旧的(但重要的)工具的输出)。我不想成为重写 top 或 ps 的人,这会使操作系统变得非 POSIX。
---- 原帖如下 ---- 某些版本的内存报告工具(如 top)错误地将线程(都可以访问相同的内存)与进程混淆了。因此,生成五个线程的 tomcat 实例将误报其内存消耗五倍。
确保的唯一方法是单独列出进程及其内存消耗,然后读取其中一个线程的内存(就像进程一样列出)。这样您就可以知道应用程序的真实内存消耗情况。如果您依赖为您执行加法的工具,您将高估引用同一共享内存的线程数量实际使用的内存量。
我曾经有过带有 2 GB 内存(和 1 GB 交换区)的盒子报告说,之前某个线程特别密集的应用程序使用了约 7GB 内存。
为了更好地了解许多工具如何报告内存,请查看此处。如果 python 代码正在解析这些工具之一的文本,或者从相同的系统调用获取该数据,那么它会在过度报告内存中遇到相同的错误。
归档时间: |
|
查看次数: |
5673 次 |
最近记录: |