如何生成JVM堆内存转储?

2025年3月17日 | 阅读 3 分钟

Java堆转储(Java Heap dump)捕获了在特定时间点JVM(Java虚拟机)中存在的所有Java对象。在堆内存中,JVM为数组和类实例等对象分配空间。当对象不再被需要或引用时,垃圾收集器会启动并释放它们占用的内存空间。

堆转储是JVM在特定时间点内存中所有对象的记录。它们对于优化Java程序的内存使用和解决内存泄漏问题非常有帮助。

堆转储文件通常以.hprof为扩展名,是二进制格式。可以使用JVisualVM和Eclipse MAT(Memory Analyzer Tool)等工具来查看和分析。为了查找缓冲区溢出等问题并优化程序的内存使用,我们会创建Java内存堆转储。Hprof文件通常用于存储二进制格式的堆转储。可以使用jhat或JVisualVM等程序打开和检查这些文件。此外,使用MAT也是Eclipse用户常见的做法。

在接下来的部分,我们将讨论创建堆转储的各种方法和工具,并重点介绍它们之间的主要区别。

方法

Java内存堆栈转储可以通过多种方式创建。JDK开发了多种用于创建堆转储的工具。这些工具可以在JDK主目录的bin文件夹中找到。让我们来谈谈如何创建JVM堆内存转储,步骤如下:

  • Jmap命令用法
  • 使用终端的jcmd命令
  • 使用JVisualVM。
  • 识别HeapDumpOnOutOfMemory
  • JMX控制台用法

1. 使用map命令

我们可以在JDK主目录的bin文件夹中执行jmap命令。它提供了关于内存使用的数据。结构如下:

输出

How to Generate JVM Heap Memory Dump

方法2:使用终端的jcmd命令

通过此命令,JVM会创建一个堆转储。Heap dump是其参数之一,调用GC。具体如下:

输出

How to Generate JVM Heap Memory Dump

方法3:使用JVisualVM工具

这个特定的实用程序包含在JDK中。它有助于监控和调试Java应用程序。它提供了一个简单易用的图形用户界面。在开始菜单中输入jvisualvm,或者在Unix的命令提示符或终端窗口中,导航到JDK主目录的bin目录并输入jvisualvm。这将启动Java Visual VM程序。它会在左侧显示当前活动的Java进程。右键单击我们想要为其创建堆转储的进程ID。选择堆转储选项后,将为选定的进程生成堆转储。堆转储生成的文件的路径显示在“基本信息”下。

How to Generate JVM Heap Memory Dump

方法4:识别HeapDumpOnOutOfMemory

当应用程序出现java.lang.OutOfMemoryError时,理想情况下应该记录堆转储。

OutOfMemoryError。堆转储可以显示当前内存中哪些活动对象存在,以及它们占用了多少内存。

当设置此系统选项时,JVM会在Java程序遇到OutOfMemoryError时,自动创建一个堆转储副本。

方法5:使用JMX控制台

Hotspot Diagnostic MBean中有一个堆转储过程。我们使用jmx消费者(如jconsole)来调用MBean操作。使用JConsole,我们可以指定主机、端口号、用户名和密码来连接本地Java程序或远程Java进程。连接到进程ID后,jconsole应用程序会打开多个选项卡。堆内存使用情况、线程、类和CPU使用情况显示在“概述”选项卡中。