Java 不同捕获堆转储的方法

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命令行工具用于手动捕获。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程