【问题标题】:Java out of memory error when memory is in fact available当内存实际上可用时,Java 内存不足错误
【发布时间】:2012-01-25 23:14:50
【问题描述】:

我一直遇到 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)

【问题讨论】:

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

标签: java memory-management


【解决方案1】:

是的,当您仍然有足够的可用堆空间时,可以获得 OOME。

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

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


很难说出你的情况发生了什么。我怀疑您的应用程序只是试图创建太多线程并遇到上述限制之一。您可以尝试减小线程堆栈大小,但更好的方法是弄清楚为什么要创建这么多线程并停止它。 (大量线程往往会浪费资源......并以各种方式使您的应用程序变慢。)

【讨论】:

    【解决方案2】:

    查看 JBoss 社区网站上的 this answer,了解为什么会出现无法创建新线程 OOM

    【讨论】:

      猜你喜欢
      • 2022-01-12
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      相关资源
      最近更新 更多