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