Sun JDK提供了jhat(JVM Heap Analysis Tool)命令与jmap搭配使用,来分析jmap生成的堆转储快照。jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,可以在浏览器中查看,在实际工作中,一般不会去直接使用jhat命令来分析demp文件,
主要原因是因为:一般不会在部署应用程序的服务器上直接分析dump文件,即使可以这样做,也会尽量将dump文件拷贝到其他机器上进行分析,因为分析工作是一个耗时且消耗硬件资源的过程,另外一个原因是jhat的分析功能相对来说很简陋,VisualVM以及专门分析dump文件的工具,都能实现比jhat更强大更专业的分析功能。

命令:jhat [ options ] heap-dump-file

option具体选项及作用如下:

  • -J< flag > 因为 jhat 命令实际上会启动一个JVM来执行, 通过 -J 可以在启动JVM时传入一些启动参数. 例如, -J-Xmx512m 则指定运行 jhat 的Java虚拟机使用的最大堆内存为 512 MB. 如果需要使用多个JVM启动参数,则传入多个 -Jxxxxxx
  • -stack false|true 关闭跟踪对象分配调用堆栈。如果分配位置信息在堆转储中不可用. 则必须将此标志设置为 false. 默认值为 true.
  • -refs false|true 关闭对象引用跟踪。默认情况下, 返回的指针是指向其他特定对象的对象,如反向链接或输入引用(referrers or incoming references), 会统计/计算堆中的所有对象。
  • -port port-number 设置 jhat HTTP server 的端口号. 默认值 7000。
  • -exclude exclude-file 指定对象查询时需要排除的数据成员列表文件。 例如, 如果文件列出java.lang.String.value , 那么当从某个特定对象 Object o 计算可达的对象列表时, 引用路径涉及 java.lang.String.value 的都会被排除。
  • -baseline exclude-file 指定一个基准堆转储(baseline heap dump)。 在两个 heap dumps 中有相同 object ID 的对象会被标记为不是新的(marked as not being new). 其他对象被标记为新的(new). 在比较两个不同的堆转储时很有用。
  • -debug int 设置 debug 级别. 0 表示不输出调试信息。 值越大则表示输出更详细的 debug 信息。
  • -version 启动后只显示版本信息就退出。

    1. [webuser@CSDN-TESTENV interaction-like]$ jhat -J-Xmx1000m -port 5000 heapDump
    2. Reading from heapDump...
    3. Dump file created Thu Apr 22 15:35:50 CST 2021
    4. Snapshot read, resolving...
    5. Resolving 614075 objects...
    6. Chasing references, expect 122 dots..........................................................................................................................
    7. Eliminating duplicate references..........................................................................................................................
    8. Snapshot resolved.
    9. Started HTTP server on port 5000
    10. Server is ready.

    jhat在分析完成后,使用HTTP服务器展示其分析结果。访问地址为http://:7000,可以看到类似如下的内容:
    image.png
    在首页底下有如下连接

  • All classes including platform

  • Show all members of the rootset
  • Show instance counts for all classes (including platform) —-每个类的对象个数,从高到低排序(不显示内存占用情况)
  • Show instance counts for all classes (excluding platform)
  • Show heap histogram —每个类的对象个数以及占用的总空间(很有用)
  • Show finalizer summary —等待回收
  • Execute Object Query Language (OQL) query (查询语法点击它自带的连接)

一般查看堆异常情况主要看这个两个部分:Show instance counts for all classes (excluding platform)
平台外的所有对象信息,Show heap histogram 以树状图形式展示堆情况。