捕获 Java 堆转储的不同方法


堆转储是在特定时间点对 Java 进程的内存(更具体地说是 Java 堆内存)进行快照。它包含有关 Java 对象和类的信息。当我们需要调试内存问题(例如内存泄漏、高内存消耗和内存不足错误)时,堆转储非常有用。Java 提供了几种捕获这些堆转储的方法,我们将在本文中探讨这些方法。

捕获 Java 堆转储的方法

可以使用以下方法捕获 Java 堆转储

  • HeapDumpOnOutOfMemoryError

  • Jcmd

  • jmap

让我们依次讨论这些方法。

使用 HeapDumpOnOutOfMemoryError

有一些方法可以手动捕获堆转储,我们将在后面讨论。本节将概述 HeapDumpOnOutOfMemoryError,它允许我们自动捕获堆转储。

在 Java 中,“OutOfMemoryError” 发生在堆内存空间不足时。这是捕获堆转储最理想的时间,因为在发生错误时很容易调查和调试内存错误。

我们可以配置 HeapDumpOnOutOfMemoryError,它会在 Java 应用程序抛出 java.lang.OutOfMemoryError 时生成堆转储。

在这种情况下,我们需要传递以下系统属性

java -XX:+HeapDumpOnOutOfMemoryError

堆转储存储的默认目录是 java_pid.hprof 文件。我们可以在运行应用程序的位置获取此文件。

使用 jcmd

“jcmd” 是 JDK 中的命令行工具。它可用于向正在运行的 Java 进程发送诊断命令。其中一个命令是 GC.heap_dump,用于从指定的 Java 进程生成堆转储。

要使用 jcmd,我们需要知道进程 ID,为了方便起见,我们可以将其称为 Java 应用程序的 PID。可以使用命令“jps”查找 PID。

使用以下命令生成堆转储

jcmd <pid> GC.heap_dump <filename>

使用 jmap

它是 JDK 中的另一个命令行工具。它可用于打印堆信息并从正在运行的 Java 进程或核心文件中生成堆转储。与 jcmd 类似,我们需要知道 Java 应用程序的进程 ID(简称 PID)才能使用 jmap。可以使用命令“jps”查找 PID。

要生成堆转储,请使用以下命令

jmap -dump:[live], format = b, file = <pathOffile> <pid>

这里,

live:这是一个可选但重要的参数,因为它只转储堆中的活动对象。换句话说,如果我们传递此选项,它只写入具有活动引用的对象。

format:它指示堆转储文件的格式。如果设置为“b”,则表示它将具有二进制格式。

pathOffile:用于指定堆转储将写入到的文件路径。

pid:指定进程 ID。

这将创建一个具有指定名称的二进制堆转储文件。提醒一下,请注意,有时此工具无法获得我们想要的结果,因为它已被 Java 弃用。最好使用本文中讨论的其他工具。

结论

我们从定义 Java 堆转储开始本文,在下一节中,我们提出了几种捕获堆转储的方法。我们讨论了三种方法,HeapDumpOnOutOfMemoryError 是一种自动捕获堆转储的方法,而 jmap 和 jcmd 命令行工具用于手动捕获。

更新于:2023-07-19

147 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告