jhat 命令通常与 jmap 搭配使用,用来分析 jmap 生成的 dump 文件,jhat 内置了一个微型的HTTP/HTML
服务器,生成 dump 的分析结果后,可以在浏览器中查看。
命令的使用格式如下。(其中heap-dump-file
为必填项)
jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <heap-dump-file>
可选参数详解:
- -stack false|true:表示关闭对象分配调用栈跟踪。如果分配位置信息在堆转储中不可用,则必须将此标志设置为 false,默认值为 true;
- -refs false|true:表示关闭对象引用跟踪。默认值为 true,默认情况下,返回的指针是指向其他特定对象的对象,如反向链接或输入引用,会统计/计算堆中的所有对象;
- -port port-number:表示设置 jhat HTTP server 的端口号,默认值 7000;
- -baseline exclude-file:表示指定一个基准堆转储。在两个 heap dumps 中有相同 object ID 的对象会被标记为不是新的,其他对象被标记为新的,在比较两个不同的堆转储时很有用;
- -debug int:表示设置 debug 级别,0 表示不输出调试信息。值越大则表示输出更详细的 debug 信息;
- -version:启动后只显示版本信息就退出;-J< flag >:因为 jhat 命令实际上会启动一个JVM来执行,通过 -J 可以在启动JVM时传入一些启动参数。例如,-J-Xmx512m 可以指定运行 jhat 的 Java 虚拟机使用的最大堆内存为 512 MB,如果需要使用多个 JVM 启动参数,则传入多个 -Jxxx即可;
- -h or -help:显示jhat命令的帮助信息;
在操作系统终端输入如下命令,即可查看相关信息,部分示例如下。
$ jhat -J-Xmx512m /xxx/dump.hprof
Reading from dump.hprof...
Dump file created Mon Feb 05 17:41:33 CST 2024
Snapshot read, resolving...
Resolving 383026 objects...
Chasing references, expect 76 dots............................................................................
Eliminating duplicate references............................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
运行成功之后在浏览器访问http://127.0.0.1:7000
,可以查询快照文件分析结果。
翻到最底部可以查询 jhat 提供的几个查询功能,部分列表信息如下。
一般查看堆内存异常情况,主要看两个部分。
- Show instance counts for all classes (excluding platform):表示平台外的所有对象信息
- Show heap histogram:以树状图形式展示堆情况
部分信息如下。
针对服务性能问题,还需要结合具体代码进行排查,观察是否有大量应该被回收的对象一直在被引用,或者是否有占用内存特别大的对象无法被回收,通常在调优的时候这两点关注的会比较多。