簡體   English   中英

實際上有可用內存時,Java內存不足錯誤

[英]Java out of memory error when memory is in fact available

即使堆顯示分配給它的所有內存都沒有用完,我仍會遇到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)

是的,當您仍然有足夠的可用堆空間時,可以獲得OOME。

創建線程時,JVM需要為線程的堆棧分配內存。 但是,JVM不會在堆中分配線程堆棧。 (線程堆棧必須位於內存中,垃圾回收器不會移動它。)相反,它直接從OS請求它。 如果操作系統不能滿足該請求,則無論堆大小如何,您都會得到一個OOME...。

顯然,如果您的應用程序超出了操作系統的每進程線程限制,則在線程創建期間也會發生OOME。 (在Linux / Unix上,這由ulimit -u ...控制)


很難說出您的情況。 我懷疑您的應用程序只是試圖創建太多線程而遇到上述限制之一。 您可以嘗試減小線程堆棧的大小,但是更好的方法是弄清楚為什么創建這么多線程並停止它。 (大量線程往往會浪費資源……並以各種方式使您的應用程序變慢。)

在JBoss社區網站上查看此答案 ,以了解為什么您將無法創建新線程OOM

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM