OutOfMemoryError堆转储

4
我遇到了一个java.lang.OutOfMemoryError: GC Overhead limit exceeded的问题,但我的应用程序没有HeapDumpOnOutOfMemoryError命令行选项。我需要一个堆转储,但当我试图使用jmap或jcmd工具捕获堆转储时,它们没有响应:
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的堆转储文件,工具会成功完成并创建并打开转储文件。
请问为什么jmap和jcmd无法完成?如何在应用程序出现OutOfMemoryError异常时捕获转储文件?应用程序仍在运行,但只有几个活动线程。
2个回答

1

可能的原因是您想要转储的堆大小过大。 请指定堆和RAM的大小。


最大堆大小为2Gb, RAM - 8Gb - Dron4K

1
这不是由于您的预期堆大小大于分配的堆大小而引起的。当JVM执行垃圾收集并且只能回收非常少的堆空间时,就会发生此错误。您的应用程序可能已经使用了几乎所有的RAM,垃圾收集器花费了太多时间尝试清理它并反复失败。
相比之下,您的应用程序性能将会较慢。这是因为CPU正在使用其全部容量进行垃圾收集,因此无法执行任何其他任务。
需要解决以下问题:
- 应用程序中占用大部分堆的对象是什么? - 这些对象在源代码的哪些部分被分配?
您还可以使用自动化图形工具,例如JConsole,帮助检测代码中的性能问题,包括java.lang.OutOfMemoryErrors。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接