jhat - 虚拟机堆转储快照分析工具

jhat(JVM Heap Analysis Tool) 主要是为了和 jmap 搭配使用,来分析 jmap 生成的转储快照。jhat 内置了一个微型的 HTTP/HTML 服务器,生成 dump 文件的分析结果后,可以在浏览器中查看。不过在实际工作中,一般都不会去直接使用 jhat 命令来分析 dump 文件。

主要原因有:

  1. 一般不会在部署应用程序的服务器上直接分析 dump 文件,即使可以这样做,也会尽量将 dump 文件复制到其他机器上进行分析,因为分析工作是一个耗时而且消耗硬件资源的过程,既然都要在其他机器进行,就没有必要受到命令行工具的限制了
  2. 再就是 jhat 的分析功能相比 VisualVM、Eclipse Memory Analyzer、IBM HeapAnalyzer 来说比较简陋。

下图展示了我们使用命令 jhat dump_file 分析上篇文章中使用 jmap 生成的转储文件:

[root@localhost ~]# jhat java_pid9565.hprof 
Reading from java_pid9565.hprof...
Dump file created Tue Apr 24 15:16:05 CST 2018
Snapshot read, resolving...
Resolving 5377 objects...
Chasing references, expect 1 dots.
Eliminating duplicate references.
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

通过浏览器打开运行 jhat 命令服务器的 7000 端口可以看到分析结果:

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

文章摘自《深入理解Java虚拟机》第二版 周志明著,仅作为学习记录,书籍中用到的案例代码及描述有部分修改,但未改变原意。