我有 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忽略(或者在这种情况下似乎忽略)内存限制吗?
原来这是一个 glibc 问题。
我的简短回答是:
export MALLOC_ARENA_MAX=1 #(或“=4”(请参阅下面@michael的评论))
这将流程占用空间(顶部的 VIRT)减少了 5 倍之多。 回到 CentOS 5 中看到的水平。
最新版本的 glibc 有一个新功能“每线程内存池”:
http://www.centos.org/docs/5/html/5.4/Technical_Notes/glibc.html
1.71.1 日志部分的最后一项讨论了它(并指的是非公开错误......)