14

我有 7 个不同的 Java 守护程序,我在 3 个不同的服务器上运行(全部 7 个)。java命令行有-Xmx2048m和-Xss1024k。在这 3 台服务器上,所有 21 个进程的顶部和顶部的 VIRT 大小均显示为略低于 2.5 GB。RES 大小从 300 GB 到 1.9 GB 不等,具体取决于它是哪个守护进程。

这就是它应该的样子。

输入新服务器。更快的 CPU,更多的 RAM(16 GB 而不是 8 GB),稍微更新的 java(旧服务器上的 1.6.0_10-b33,新服务器上的 1.6.0_31-b04)。两个系统(和 JVM)都是 64 位的。

将 2 个守护进程移至新服务器。在新服务器上,给定相同的任务,守护进程既消耗大量 CPU(大约相当于一个内核的价值),又完成得更少。(从旧系统上的 5110 处理器移至新系统上的 5620)。

几乎是一个完整的额外核心 CPU 使用率(GC 线程??),一个守护进程报告 5 GB VIRT 和 2 GB RES,另一个守护进程报告 10.5 GB VIRT 和 2 GB RES。

有什么想法会导致java忽略(或者如果是这种情况的话似乎忽略)内存限制?

4

1 回答 1

13

原来这是一个 glibc 问题。

对我来说,简短的回答是:

导出 MALLOC_ARENA_MAX=1

这将流程占用空间(顶部的 VIRT)减少了多达 5 倍。回到 CentOS 5 中看到的级别。

最新版本的 glibc 有一个新特性“每线程内存池”:

http://www.centos.org/docs/5/html/5.4/Technical_Notes/glibc.html

1.71.1 日志部分中的最后一项讨论了它(并指的是非公共错误......)

于 2012-09-02T01:19:57.687 回答