0%

jhat 基本命令

JDK 的 bin 目录下为 Java 开发人员提供了很多实用的小工具,很多场景下都会用到它们,比如:打包、部署、签名、调试、监控、运维等。本文介绍其中一款:

jhat (JVM Heap Analysis Tool): 虚拟机堆转储快照分析工具

功能

与 jmap 搭配使用,分析 jmap 生成的堆转储快照。

实现方式

jhat 内置了一个微型的 HTTP/Web 服务器,生成堆转储快照的分析结果后,可以在浏览器中查看。

使用情况

在实际工作中,多数人是不会直接使用 jhat 命令来分析堆转储快照文件的,主要原因是:

  • 一般不会在部署应用程序的服务器上直接分析堆转储快照,即使可以这样做,也会尽量将堆转储快照文件复制到其他机器上进行分析,因为分析工作是一个耗时而且极为耗费硬件资源的过程(加载 dump 快照文件需要比生成 dump 更大的内存)。

    • (话说回来,既然都要在其他机器上进行,还有必要再受命令行工具的限制吗?)
  • jhat 的分析功能相对来说比较简陋,VisualVM 或 JProfiler 等工具也可以分析堆转储快照文件,而且能提供比 jhat 更强大专业的分析功能。

命令格式

1
jhat <filename>

使用 jhat 分析 dump 文件

arthas 官网提供的 arthas-demo.jar 为例。

  1. 在本地启动 arthas-demo.jar,并将日志输出到指定文件:
1
$ nohup java -jar arthas-demo.jar > demo.log &
  1. jps 查询 LVMID (进程 ID) 为 65034:
1
$ jps -l | grep arthas-demo.jar
  1. 生成 Java 堆转储快照。
1
$ jmap -dump:format=b,file=demo.bin 65034
  1. jhat 分析
1
$ jhat demo.bin

“Server is ready” 后,在浏览器中输入 http://localhost:7000/ 可以查看分析结果。

分析结果默认以包为单位进行分组显示,分析内存泄漏问题主要会使用到上图中的 “Show heap histogram”(与 jmap-histo 功能一样)OQL 页签的功能(上图中的 “Execute Object Query Language (OQL) query”),前者可以找到内存中总容量最大的对象,后者是标准的对象查询语言,使用类似 SQL 的语法对内存中的对象进行查询统计。


欢迎关注我的其它发布渠道