# 捕获 Java 堆转储的前 3 种方法

> 原文： [https://javatutorial.net/capture-java-heap-dump](https://javatutorial.net/capture-java-heap-dump)

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

Java [堆转储](https://www.ibm.com/support/knowledgecenter/en/SS3KLZ/com.ibm.java.diagnostics.memory.analyzer.doc/heapdump.html)是诊断与内存相关的问题的重要对象，这些问题包括`java.lang.OutOfMemoryError`，垃圾收集问题和内存泄漏（缓慢），这些都是 Java Web 开发的一部分。

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

可以帮助您分析堆转储的工具包括 [Heap Hero](http://heaphero.io) 和 [Eclipse MAT](https://www.eclipse.org/mat/) 。 但是，您仍然需要为工具提供在正确的时间和正确格式下捕获的堆转储。

## 1\. `jmap –XX:+HEAPDUMPONOUTOFMEMORYERROR`

值得注意的是，`jmap`会将堆转储打印到特定的文件位置。`jmap`工具通常打包在 [JDK](https://javatutorial.net/install-java-8-jdk-on-ubuntu) 中。 您可以在以下文件夹中找到它：`<JAVA_HOME>\bin`。

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

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

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

## 2\. `HeapDumpOnOutOfMemoryError`

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

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

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

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

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

## 3\. `jcmd`

`jcmd`工具用于发送命令请求以诊断 Java [JVM](https://javatutorial.net/jvm-explained) 。 同样，`jcmd`工具包含在 JDK 软件包中。 您可以在名为`bin`的文件夹中获取它。

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

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

结论

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