【发布时间】:2011-02-04 06:18:57
【问题描述】:
背景:
我有一组 java 后台工作程序,作为我的 web 应用程序的一部分。我在 Ubuntu 10.10 上进行本地开发并部署到 Ubuntu 10.04LTS 服务器(一个 media Temple (ve) 实例)。
它们都运行相同的 JVM:Sun JVM 1.6.0_22-b04。作为初始化脚本的一部分,每个 worker 都以显式的 Xmx、Xms 和 XX:MaxPermGen 设置启动。
然而不知何故,所有 10 个工作人员在本地都使用 250MB,而在服务器上他们使用超过 2.7GB。
我不知道如何开始追踪它。我认为 Ubuntu(以及内核)版本可能会有所不同,但我尝试了一个旧的 10.04 虚拟机,它的行为符合预期。
我注意到这台机器似乎从来没有将内存用于缓冲区或缓存(根据htop),这似乎有点奇怪,但对于服务器来说可能是正常的?
(已编辑) 一些信息:
(server)
root@devel:/app/axir/target# uname -a
Linux devel 2.6.18-028stab069.5 #1 SMP Tue May 18 17:26:16 MSD 2010 x86_64 GNU/Linux
(local)
wiktor@beastie:~$ uname -a
Linux beastie 2.6.35-25-generic #44-Ubuntu SMP Fri Jan 21 17:40:44 UTC 2011 x86_64 GNU/Linux
(已编辑)
比较 PS 输出:(ps -eo "ppid,pid,cmd,rss,sz,vsz")
PPID PID CMD RSS SZ VSZ
(local)
1588 1615 java -cp axir-distribution. 25484 234382 937528
1615 1631 java -cp /home/wiktor/Code/ 83472 163059 652236
1615 1657 java -cp /home/wiktor/Code/ 70624 89135 356540
1615 1658 java -cp /home/wiktor/Code/ 37652 77625 310500
1615 1669 java -cp /home/wiktor/Code/ 38096 77733 310932
1615 1675 java -cp /home/wiktor/Code/ 37420 61395 245580
1615 1684 java -cp /home/wiktor/Code/ 38000 77736 310944
1615 1703 java -cp /home/wiktor/Code/ 39180 78060 312240
1615 1712 java -cp /home/wiktor/Code/ 38488 93882 375528
1615 1719 java -cp /home/wiktor/Code/ 38312 77874 311496
1615 1726 java -cp /home/wiktor/Code/ 38656 77958 311832
1615 1727 java -cp /home/wiktor/Code/ 78016 89429 357716
(server)
22522 23560 java -cp axir-distribution. 24860 285196 1140784
23560 23585 java -cp /app/axir/target/a 100764 161629 646516
23560 23667 java -cp /app/axir/target/a 72408 92682 370728
23560 23670 java -cp /app/axir/target/a 39948 97671 390684
23560 23674 java -cp /app/axir/target/a 40140 81586 326344
23560 23739 java -cp /app/axir/target/a 39688 81542 326168
它们看起来非常相似。事实上,现在的问题是,为什么如果我将服务器上的虚拟内存使用量(3.2GB)加起来,它是否更接近地反映了 2.4GB 的内存使用量(根据free),但在本地使用的虚拟内存加起来到更大的 4.7GB,但实际上只使用了 ~250MB。似乎内存没有被积极地共享。 (如果可能的话)
感谢您的帮助,
维克托
【问题讨论】:
-
是的,但本地客户端也是如此。
-
java 类数据共享是否在两种环境中都有效?尝试使用 java -Xshare:on 运行以确保它是。此外,针对您的 jvm 运行 jmap 以查看内存是如何在内部映射的;也许您的服务器上有动态库,无论出于何种原因,它们都是超大尺寸的。
-
嗯。奇怪的是,如果我尝试在本地或服务器上使用
-Xshare:on,我会收到消息:类数据共享与其他指定选项不一致。 VM 初始化期间发生错误无法使用共享存档。
我用VisualVM看运行过程,很不起眼。早些时候我发布了关于如何同时运行几个“hello world”应用程序会耗尽我所有内存的文章,但 JMX 给出了正常的数字:stackoverflow.com/questions/4893061/…(820KB 堆;8.4MB PermGen)
谢谢