当内存实际上可用时,Java内存不足错误

当内存实际上可用时,Java内存不足错误,java,memory-management,Java,Memory Management,我一直遇到OOM错误和随后的JBoss崩溃,即使堆显示分配给它的所有内存都没有用完 例如:如果我将1200MB分配为堆大小(Xmx),则崩溃会远远低于该限制,堆中没有一个单独的代(年轻/年老/永久)是100% 这个箱子里有很多公羊。为什么java会报告这个错误,而它实际上并没有内存不足 Heap PSYoungGen total 67456K, used 9525K [0x57540000, 0x5c170000, 0x5fa90000) eden space 66432K,

我一直遇到OOM错误和随后的JBoss崩溃,即使堆显示分配给它的所有内存都没有用完

例如:如果我将1200MB分配为堆大小(Xmx),则崩溃会远远低于该限制,堆中没有一个单独的代(年轻/年老/永久)是100%

这个箱子里有很多公羊。为什么java会报告这个错误,而它实际上并没有内存不足

 Heap

 PSYoungGen      total 67456K, used 9525K [0x57540000, 0x5c170000, 0x5fa90000)
  eden space 66432K, 12% used [0x57540000,0x57d91520,0x5b620000)
  from space 1024K, 98% used [0x5c070000,0x5c16c198,0x5c170000)
  to   space 3008K, 0% used [0x5bb90000,0x5bb90000,0x5be80000)

 PSOldGen        total 466048K, used 313530K [0x14a90000, 0x311b0000, 0x57540000)
  object space 466048K, 67% used [0x14a90000,0x27cbea38,0x311b0000)

 PSPermGen       total 226432K, used 141461K [0x04a90000, 0x127b0000, 0x14a90000)
  object space 226432K, 62% used [0x04a90000,0x0d4b55e8,0x127b0000)

在JBoss社区站点上查看一下为什么您会得到无法创建新线程的OOM是的,当您仍然有足够的空闲堆空间时,您可能会得到OOME

创建线程时,JVM需要为线程堆栈分配内存。但是JVM不会在堆中分配线程堆栈。(线程堆栈需要位于不会被垃圾收集器移动的内存中。)相反,它直接从操作系统请求它。如果操作系统不能满足这个要求,你会得到一个OOME。。。不管堆大小如何

显然,如果应用程序超出操作系统的每进程线程限制,那么OOME也可能在线程创建期间发生。(在Linux/Unix上,这由
ulimit-u
控制)



要说出你的情况有点困难。我怀疑您的应用程序只是试图创建太多线程,并遇到了上述限制之一。您可以尝试减少线程堆栈的大小,但更好的方法是找出创建这么多线程的原因并停止它。(大量线程往往会浪费资源……并以各种方式降低应用程序的速度。)

消息为-OOM-无法创建新线程您应该编辑上面的帖子,并粘贴收到的实际完整的错误消息。