当前位置: 首页 > 面试题库 >

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

邹宣
2023-03-14
问题内容

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


问题答案:

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



 类似资料:
  • 我有7个不同的java守护进程,我在3个不同的服务器上运行(全部7个)。java命令行具有-Xmx2048m和-Xss1024k。在这3台服务器上,所有21个进程的顶部和顶部的VIRT大小都略低于2.5 GB。根据守护进程的不同,RES大小从300到1.9 GB不等。 这一切都是应该的。 输入新服务器。更快的CPU、更多的RAM(16 GB而不是8 GB)、稍新的java(旧服务器上为1.6.0_

  • 我们在日志中看到了OutOfMemoryExceptions,它们似乎与java堆提交大小从~1G增长到~2.4G一致。尽管有错误消息,但堆空间似乎没有用完。除了抛出异常(和生成的堆转储)之外,调整大小似乎最终会成功,应用程序继续运行,没有任何问题(堆提交大小约2.4G)。 下面是日志输出的一个示例: 请注意,在OOME之前,提交的堆总数在1GB和2.4GB之间振荡。我们可以看到,它之前非常稳定在

  • 假设我有32 GB的RAM,我通过指定-xmx2048m为我的java进程分配了2GB。但实际上我的进程通常只消耗1GB的堆。那么分配的剩余1GB内存会发生什么呢?剩余的RAM总量是30 GB还是31 GB?

  • 我知道如何使用-Xss为java线程设置堆栈大小,我们在产品中使用它。 但是当我们的应用程序中使用了很多线程,并且设置了-Xss(我们设置为512k我们的使用)。我们会遇到错误报告无法创建新的本机线程。它应该与堆栈大小有关,因为当我们设置-Xss256k时,错误消失了。 我的问题是对于1个线程,Xss设置堆栈大小,但是对于所有线程,堆栈大小如何<整个线程的总堆栈内存大小的限制是什么?我没有发现这样

  • 问题内容: 好吧,我试图理解并阅读可能导致它的原因,但我却无法理解: 我的代码中有这个地方: 事实是,当它尝试调用某些方法时,它将引发而不是其他预期的异常(特别是)抛出 。我实际上知道调用了什么方法,所以我直接转到该方法代码,并为应该抛出的行添加了一个块 ,它实际上按预期抛出。然而,当它上升时,以某种方式更改了上面的代码并没有 按预期进行。 是什么原因导致这种行为的?我该如何检查? 问题答案: 通

  • 为什么我在下面的代码段中的X轴上有一个溢出? 在我的网格容器上应用时,就会产生溢出。 null null https://codepen.io/anon/pen/wdjexz?editors=1100