2013-06-20 73 views
1

在我們的Tomcat應用程序中,出現「OutOfMemoryError:超出GC開銷限制」。 但Runtime.getRuntime().freeMemory()報告576 MB是免費的。OutOfMemoryError(超出GC開銷限制)但仍有大量可用空間

這是怎麼發生的?

該錯誤是從SQL Server JDBC驅動程序中拋出的,我無法想象這會嘗試在一個內存請求中分配數百兆字節。 而在錯誤發生前的幾分鐘內,「PS Scavenge」和「PS ​​MarkSweep」的計數並沒有增加太多。

Runtime.getRuntime().maxMemory()以及Runtime.getRuntime().totalMemory()報告4.5 GB。這與64位Sun JVM for Java 7一起運行。

+0

stacktrace請 –

+0

請粘貼整個堆棧跟蹤 - 由於堆耗盡或燙髮導致內存不足。或其他東西... – Scorpion

+2

這個答案可能會有所幫助:http://stackoverflow.com/a/1393503 - 它解釋了這個特定的意義OutOfMemoryError – konradstrack

回答

5

「超出GC開銷限制」意味着您的堆未耗盡,但在垃圾回收上花費的CPU時間已超過預定義的限制。基本上,你的JVM除了收集垃圾之外別無他法。這可能是由多種原因引起的,最典型的是堆積爲用盡,但每個主要的GC都能夠足夠滿足分配請求。

在你的情況下,可能會有其他原因,例如巨大的堆大小以及太多的主要GC。您需要使用診斷工具調查您的情況。我強烈建議visualgc

+0

我很難相信它可以發生超過512 MB宣佈免費:/ – fge

+0

是的,這是一個錯誤的發現或一些非常奇怪的事情正在... –

+0

@fge同意,但儘管如此答案和建議使用一些診斷工具是絕對正確的:) –

相關問題