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

Fra*_*kPl 1 java tomcat garbage-collection out-of-memory

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

怎么会发生这种情况?

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

Runtime.getRuntime().maxMemory()以及Runtime.getRuntime().totalMemory()报告4.5 GB.这与64位Sun JVM for Java 7一起运行.

Mar*_*nik 5

"超出GC开销限制"意味着您的堆没有用尽,但是在垃圾回收上花费的CPU时间量已超过预定义的限制.基本上,除了收集垃圾之外,你的JVM几乎没有其他功能.这可能是由多种原因造成的,最典型的是堆几乎耗尽,但每个主要的GC设法只是满足分配请求.

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