[英]OutOfMemoryError heap dump
我有一个java.lang.OutOfMemoryError:GC Overhead limit exceeded
。 我的应用程序没有HeapDumpOnOutOfMemoryError
命令行选项。 我需要堆转储,但是当我尝试使用jmap
或jcmd
工具捕获转储时,它们没有响应:
地图
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
异常捕获应用程序的转储? 应用程序仍在工作,但只有几个活动线程。
一种可能性是您打算转储的堆大小太大。 请指定堆和 RAM 的大小。
这不是因为您的预期堆大小大于分配的堆大小。 当 JVM 花费太多时间执行垃圾收集并且只能回收很少的堆空间时,就会发生此错误。 您的应用程序可能最终使用了几乎所有 RAM 并且垃圾收集器花费了太多时间尝试清理它并反复失败。
您的应用程序的性能会相对较慢,这是因为 CPU 将其全部容量用于垃圾收集,因此无法执行任何其他任务。
需要解决以下问题:
您还可以使用自动图形工具,例如 JConsole,它有助于检测代码中的性能问题,包括 java.lang.OutOfMemoryErrors。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.