原文: https://javatutorial.net/capture-java-heap-dump

在本文中,我将教您多种捕获 Java 堆转储的方法。 对于优化内存消耗至关重要,堆转储被描述为 Java 进程的内存打印。

Java 堆转储是诊断与内存相关的问题的重要对象,这些问题包括java.lang.OutOfMemoryError,垃圾收集问题和内存泄漏(缓慢),这些都是 Java Web 开发的一部分。

为了清楚起见,在进行快照的瞬间,堆转储包含诸如 Java 类和堆中的对象之类的信息。

可以帮助您分析堆转储的工具包括 Heap HeroEclipse MAT 。 但是,您仍然需要为工具提供在正确的时间和正确格式下捕获的堆转储。

1. jmap –XX:+HEAPDUMPONOUTOFMEMORYERROR

值得注意的是,jmap会将堆转储打印到特定的文件位置。jmap工具通常打包在 JDK 中。 您可以在以下文件夹中找到它:<JAVA_HOME>\bin

要调用jmap,请执行以下过程。

jmap -dump: live, file=<file-path> <pid>,其中pid是 Java 进程 ID,将为其捕获堆转储。此外,file-path是其中打印堆转储的文件路径。

请注意,传递“实时”选择至关重要。 如果选项“通过”,则只会将活动对象写入堆转储文件。 但是,如果您无法通过该选项,则所有对象(包括未设置为垃圾收集的对象)都将被打印到堆转储中。 这样的错误会过多且不必要地增加其堆转储的大小。 通过将您的移动开发需求与 Java Development Company 签订合同,可以避免此类错误。

2. HeapDumpOnOutOfMemoryError

当应用程序遇到java.lang.OutOfMemoryError时,捕获瞬时堆转储至关重要。

这样的过程将有助于确定内存中占用的对象以及它们在java.lang.OutOfMemoryError发生时的位置所占用的空间量(百分比)。

但是,由于操作和技术很多,操作组可能无法捕获堆转储。 此外,团队可能还重新启动了该应用程序。 因此,堆转储捕获已成为系统应用程序的关键方面,尤其是在涉及内存问题时。

幸运的是,XX:+HeapDumpOnOutOfMemoryError选项将在该过程中提供帮助。 您只需在应用程序启动时传递系统属性(XX:+HeapDumpOnOutOfMemoryError)。 然后, JVM 将通过在 JVM 面临OutOfMemoryError的确切时间捕获堆转储来完成其余工作。

值得注意的是,在上述情况下将捕获的头转储将打印在名为-XX:HeapDumpPath的系统属性概述的位置中

3. jcmd

jcmd工具用于发送命令请求以诊断 Java JVM 。 同样,jcmd工具包含在 JDK 软件包中。 您可以在名为bin的文件夹中获取它。

这是调用jcmd时需要使用的过程;

  1. 转到jcmd <pid> GC.heap_dump <file-path>
  2. 其中pid:是一个 Java 进程 ID,将为其捕获堆转储
  3. 另外,file-path是在其中打印堆转储的文件路径。

结论

在本文中,我讨论了可用于捕获 Java 堆转储的三个主要过程:(1)jmap –XX:+HEAPDUMPONOUTOFMEMORYERROR(2)HeapDumpOnOutOfMemoryError和(3)jcmd