一尘不染

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

linux

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

这就是应有的一切。

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

将其中两个守护程序移至新服务器。在新服务器上,给定相同的任务,这些守护进程既消耗大量CPU(大约相当于一个内核的价值),又消耗更少的工作。(已从旧系统上的5110处理器迁移到新系统上的5620s)。

几乎完全占用了CPU的使用率(GC线程?),并为一个守护程序报告了5 GB VIRT和2 GB RES,为另一个守护程序报告了10.5 GB VIRT和2
GB RES。

有什么想法会导致Java忽略内存限制(或者在这种情况下似乎忽略)?


阅读 405

收藏
2020-06-07

共1个答案

一尘不染

原来这是一个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日志部分的最后一项对此进行了讨论(并涉及一个非公开的错误…。)

2020-06-07