我有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
异常捕获应用程序的转储?应用程序仍在运行,但只有少数活动线程。
答案 0 :(得分:0)
一种可能性是您要转储的堆大小太大。 请指定堆和RAM的大小。
答案 1 :(得分:0)
这不是由于您的预期堆大小超过分配的堆大小。当JVM花费太多时间执行垃圾收集并且只能回收非常少的堆空间时,会发生此错误。你的应用程序可能最终使用了几乎所有的RAM而垃圾收集器花了太多时间来尝试清理它并反复失败。
您的应用程序的性能相对较慢,这是因为CPU使用其整个垃圾收集容量,因此无法执行任何其他任务。
以下问题需要解决:
您还可以使用自动图形工具(如JConsole)来帮助检测代码中的性能问题,包括java.lang.OutOfMemoryErrors。