OutOfMemoryError(超出GC开销限制)但仍有很多可用空间

时间:2013-06-20 08:27:33

标签: java tomcat garbage-collection out-of-memory

在我们的Tomcat应用程序中,我们得到“OutOfMemoryError:超出GC开销限制”。 但Runtime.getRuntime().freeMemory()报告576 MB是免费的。

这怎么可能发生?

从SQL Server JDBC驱动程序中抛出错误,我无法想象这将尝试在一个内存请求中分配数百兆字节。 并且“PS Scavenge”的GarbageCollectorMXBean计数以及“PS MarkSweep”在错误发生之前的几分钟内没有增加太多。

Runtime.getRuntime().maxMemory()以及Runtime.getRuntime().totalMemory()报告4.5 GB。这是使用64位Sun JVM for Java 7运行的。

1 个答案:

答案 0 :(得分:5)

“超出GC开销限制”意味着您的堆没有耗尽,但是在垃圾回收上花费的CPU时间量已超过预定义的限制。基本上,除了收集垃圾之外,你的JVM几乎没有其他功能。这可能是由多种原因引起的,最常见的原因是堆几乎耗尽,但是每个主要的GC都设法将squeeeze出来,足以满足分配请求。

在您的情况下,可能还有其他原因,例如巨大的堆大小以及太多的主要GC。您需要使用诊断工具调查您的情况。我强烈推荐visualgc