获取 JVM 堆转储
本文档介绍了在 Java 机器上创建堆转储以调查潜在内存泄漏的过程。
虽然当 OutOfMemoryError 通过指定 -XX:+HeapDumpOnOutOfMemoryError
VM 选项抛出时会自动生成堆转储,但我们可以使用 jmap
工具来打印给定进程或核心文件或远程调试服务器的共享对象内存映射或堆内存详细信息。如果给定进程在 64 位 VM 上运行,则可能需要指定 -J-d64 选项,例如
$ jmap -J-d64 -heap <pid>
要获取机器上运行的 Java 进程列表,请使用 jps
或 jcmd
命令。
在 Windows 系统中,如果不存在 dbgeng.dll,则需要安装“Windows 调试工具”才能使这些工具正常工作。此外,PATH 环境变量应包含目标进程使用的 jvm.dll 的位置或生成崩溃转储文件的 位置。例如,设置 PATH=<jdk>\jre\bin\client;%PATH%
当不使用任何选项时,jmap 会打印共享对象映射。通常,我们分析需要的内容示例如下
$ jmap -dump:[live,]format=b,file=<filename>.bin <pid>
以上将以二进制格式将 Java 堆转储到 filename。如果使用可选的 live
子选项,则会转储堆中的活动对象。
查看堆转储
要浏览如上生成的堆转储,可以使用 jhat(Java 堆分析工具)来读取生成的 文件。
与 jmap 一起使用的一些有用选项是
-
-heap 打印堆摘要而不是二进制转储。
-
-histo[:live] 打印堆的直方图。
-
-F 可以与 jmap -dump 或 jmap -histo 选项一起使用,如果 pid 没有响应。
我们可以使用 jhat 命令解析 java 堆转储文件并启动一个 Web 服务器,以便通过 Web 浏览器查看堆转储。默认端口是 7000,但我们可以使用 -port
选项更改它
语法
$ jhat [ options ] <heap-dump-file>
例如 jhat -port 7001 -debug 1
其中 -port 确定可以查看输出的浏览器端口,而 -debug <int> 确定显示的调试详细信息级别。
我们还可以使用 jconsole
工具以图形格式查看 CPU、内存和堆使用情况。
$ jconsole [ options ] [ connection ... ]
例如 jconsole -interval=5 <pid> 127.0.0.1:7474
其中 -interval=n 确定以秒为单位的报告刷新间隔,<pid> 是目标 JVM 的进程 ID(JVM 必须以与运行 jconsole 相同的用户 ID 运行)
参考资料
此页面是否有帮助?