什么会导致Java进程大大超过Xmx或Xss的限制?

2022-09-04 03:13:39

我有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忽略(或者在这种情况下似乎忽略)内存限制?


答案 1

事实证明,这是一个glibc问题。

我的简短回答是:

导出MALLOC_ARENA_MAX=1

这减少了多达5倍的工艺足迹(VIRT在顶部)。回到 CentOS 5 中的水平。

最新版本的 glibc 具有新功能“每线程内存池”:

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

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


答案 2