OutOfMemoryError堆转储

时间:2018-06-16 16:49:28

标签: java out-of-memory heap dump

我有java.lang.OutOfMemoryError:GC Overhead limit exceeded。 我的应用程序没有HeapDumpOnOutOfMemoryError命令行选项。 我需要堆转储,但当我尝试使用jmapjcmd工具捕获转储时,它们没有响应:

JMAP

D:\program>jmap -dump:live,format=b,file=d:\dump4.hprof 8280
Dumping heap to D:\dump4.hprof ...

jcmd

D:\program>jcmd 8280 GC.heap_dump d:\dump6.hprof
8280:

进程尚未完成,但会创建转储文件。当我用VisualVM打开它们时,它们无限加载。

如果我捕获例如堆转储VisualVM,工具成功完成,并创建和打开转储。

您能否解释为什么jmapjcmd没有完成?如何使用OutOfMemoryError异常捕获应用程序的转储?应用程序仍在运行,但只有少数活动线程。

2 个答案:

答案 0 :(得分:0)

一种可能性是您要转储的堆大小太大。 请指定堆和RAM的大小。

答案 1 :(得分:0)

这不是由于您的预期堆大小超过分配的堆大小。当JVM花费太多时间执行垃圾收集并且只能回收非常少的堆空间时,会发生此错误。你的应用程序可能最终使用了几乎所有的RAM而垃圾收集器花了太多时间来尝试清理它并反复失败。

您的应用程序的性能相对较慢,这是因为CPU使用其整个垃圾收集容量,因此无法执行任何其他任务。

以下问题需要解决:

  • 应用程序中占用堆的大部分的对象是什么?
  • 源代码的哪些部分是这些对象被分配的?

您还可以使用自动图形工具(如JConsole)来帮助检测代码中的性能问题,包括java.lang.OutOfMemoryErrors。