捕获系统堆转储数据关闭

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了捕获系统堆转储数据关闭相关的知识,希望对你有一定的参考价值。

参考技术A 是Java意外退出。
堆转储是JVM中特定时刻内存中的所有对象的快照。它们对于解决内存泄漏问题并优化Java应用程序中的内存使用情况非常有用。
堆转储通常以二进制格式hprof文件存储。我们可以使用jhat或JVisualVM等工具打开和分析这些文件。此外,对于Eclipse用户来说,使用MAT是很常见的。

OutOfMemoryError 堆转储

【中文标题】OutOfMemoryError 堆转储【英文标题】:OutOfMemoryError heap dump 【发布时间】:2018-11-26 03:23:02 【问题描述】:

我有一个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 异常的应用程序转储?应用程序仍在运行,但只有几个活动线程。

【问题讨论】:

【参考方案1】:

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

【讨论】:

最大堆大小为 2Gb,RAM - 8Gb【参考方案2】:

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

您的应用程序的性能会相对较慢,这是因为 CPU 正在将其全部容量用于垃圾收集,因此无法执行任何其他任务。

需要解决以下问题:

应用程序中哪些对象占据了堆的大部分? 这些对象分配在源代码的哪些部分?

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

【讨论】:

以上是关于捕获系统堆转储数据关闭的主要内容,如果未能解决你的问题,请参考以下文章

创建和分析 Java 堆转储(Heap Dumps)

在大型 Java 堆转储中查找内存泄漏的方法

Java堆转储在Google App引擎标准环境中?

在保留一些堆信息的同时减少托管程序的小型转储的大小?

内存不足时的 Java EE 堆转储

捕获异常时将有用数据转储到控制台