多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 捕获 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`。