java程序在达到xmx之前内存不足

Redhat CentOS 6.4只有几个进程运行,使用大约3GB RAM(系统有12GB可用)。 其中一个进程是WSO2ESB服务器(java),我们从这些参数开始:

-Xms2048m -Xmx3072m 

一段时间后,我们得到一个OutOfMemoryexception,但是java进程(WSO2ESB)进程甚至没有使用它的3GB 。 在jconsole中,你也可以看到正确设置的那些参数(Linux服务器在这一点上有大约9GB的可用RAM)

Linux不给我们configuration的3 GB的RAM吗?

在一个完全相同的Windows安装 – Java进程可以使用它的3GB RAM没有任何问题。

在这里输入图像说明 jconsole的屏幕截图仅显示了0.3到1.0 GB之间的堆内存使用情况。 在OutOfMemoryexception的时刻堆内存是在0.5GB,但进程将有3GB的工作,但它不…

编辑:添加java进程的日志:

 java.lang.OutOfMemoryError: unable to create new native thread 

EDIT2:添加了免费的-m输出: 在这里输入图像说明

我解决了这个问题。 wso2esb使用了超过1000个线程。 但在Linux上,用户可以使用的默认线程数设置为1024.我必须提高用户的限制,现在一切正常。

为此,请打开/etc/security/limits.conf并为用户添加以下两行内容:

 myuser soft nproc 8192 myuser hard nproc 8192 

在这里输入图像说明

Java有多代堆空间,新旧永久代。

如果你设置了非常高的Xmx,那就是用来堆的,即使你不使用整个堆,也可能会导致内存不足。 这通常会在PermGen空间用尽时发生。

永久生成堆用于存储JVM所需的String池和各种元数据,这些数据与Class,Method和其他Java原语相关。 烫发空间通常是64MB,所以如果你有很多类或者很多的string,你可以用完。

尝试增加permgen大小:

 -XX:MaxPermSize=256m 

到你的java启动选项。

什么是你的数据段大小为堆-Xms2048m -Xmx3072m

您的数据段大小应该与您的最大堆大小(在这种情况下是3072m)相对应。 所以你的数据段的大小应该设置为至less3221225472 (字节3 * 1024 * 1024 * 1024 = 3GB)