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 为例。
- 在本地启动 arthas-demo.jar,并将日志输出到指定文件:
1 | $ nohup java -jar arthas-demo.jar > demo.log & |
- jps 查询 LVMID (进程 ID) 为 65034:
1 | $ jps -l | grep arthas-demo.jar |
- 生成 Java 堆转储快照。
1 | $ jmap -dump:format=b,file=demo.bin 65034 |
- jhat 分析
1 | $ jhat demo.bin |
“Server is ready” 后,在浏览器中输入 http://localhost:7000/ 可以查看分析结果。
分析结果默认以包为单位进行分组显示,分析内存泄漏问题主要会使用到上图中的 “Show heap histogram”(与 jmap-histo
功能一样) 与 OQL 页签的功能(上图中的 “Execute Object Query Language (OQL) query”),前者可以找到内存中总容量最大的对象,后者是标准的对象查询语言,使用类似 SQL 的语法对内存中的对象进行查询统计。