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)