【问题标题】:Linux configurations that would affect Java memory usage?会影响 Java 内存使用的 Linux 配置?
【发布时间】: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 都以显式的 XmxXmsXX: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)
    谢谢

标签: java linux memory


【解决方案1】:

据我所知,服务器上的“java -server”选项是默认选项,也许这会带来这个问题。尝试在客户端使用 -server 选项运行

【讨论】:

  • 啊,好主意。我在本地修改了我的运行脚本,在参数中添加了-server 选项。但它似乎没有任何效果。我同样尝试在服务器上使用“-client”运行,但没有任何效果。
  • 也许您可以在 VM Summary 选项卡上使用jconsole (JMX) VM 设置检查两个 VM 的差异。
  • 嗯。他们彼此差不多。在 GC 之后,它们都使用了大约 3MB 的 RAM;它们都有 22 个线程; PermGen 为 15.7MB;唯一明显的区别是一个加载了 2,106 个类(服务器),0 个共享;另一个加载了 2,093 个类(本地),0 个共享。在“系统属性”下,唯一的区别(我运行了一个差异)是 os.versionsun.jnu.encodinguser.diruser.homeuser.nameuser.timezone,它们似乎都不重要。
猜你喜欢
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
  • 2020-03-16
  • 1970-01-01
  • 2015-11-06
相关资源
最近更新 更多