2012-01-25 74 views
2

即使堆顯示分配給它的所有內存未用完,我仍會遇到OOM錯誤和隨後的JBoss崩潰。當內存實際上可用時出現Java內存不足錯誤

例如:如果我將1200MB作爲堆大小(Xmx)進行分配,則崩潰發生的次數遠低於此限制,且堆中沒有任何一代(年/舊/ perm)爲100%。

該盒子有大量的RAM。爲什麼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) 
+0

消息是 - OOM - 無法創建新線程 – Kailash

+6

您應該編輯上面的帖子並粘貼* actual和完成*您收到的錯誤信息。 –

回答

3

是有可能得到一個OOME時,你仍然有大量的免費堆空間。

當您創建一個線程時,JVM需要爲該線程的堆棧分配內存。但是JVM不會在堆中分配線程堆棧。 (線程堆棧需要放在內存中,垃圾收集器不會移動它),而是直接從操作系統請求它。如果操作系統無法滿足該請求,則無論您的堆大小如何,都會得到OOME ...。

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


這是一個有點很難說什麼是你的情況發生。我懷疑你的應用程序只是試圖創建太多的線程並且遇到上述限制之一。你可以嘗試減少線程堆棧大小,但更好的方法是找出爲什麼你要創建這麼多線程並停止它。 (大量線程傾向於浪費資源......並且以各種方式使應用程序變得更慢)。

2

對JBoss的社區網站,爲什麼你會得到一看this answer將無法​​創建一個新的線程OOM