jhat是JDK自带的堆转储分析工具,可以用来查看.hprof文件中对象的具体内容。本文演示使用的是JKD8.
一、启动jhat
执行启动命令。
jhat -J-Xmx4g your_heap_dump.hprof
-J-Xmx4g表示为jhat分配4GB内存,根据你自己情况调整大小。your_heap_dump.hprof是dump出来的hprof文件名
回车执行命令后,会启动jhat并分析hprof,需要稍作等待一下,执行效果如下图
浏览器输入:http://localhost:7000
即可访问jhat,查看对应dump出来的hprof文件内的堆栈信息、对象信息。
二、使用Heap Histogram查询具体实例
在上面的打开的jhat页面,拉到最底部,会显示jhat带的一些其它工具或者功能。
点击how heap histogram,可以使用heap histogram查看堆栈信息,实例信息。
然后自己输入关键字搜索自己想看的对象信息,比如InMemoryWebSessionStore
点击进去可以看到相关对象信息
三、使用OQL查询dump.hprof文件内具体对象的属性值、内容
OQL(Object Query Language)是JHAT提供的一种查询语言,可以帮助你从堆转储(heap dump)中查询和分析对象
OQL类似于SQL,但专门用于查询Java堆中的对象。基本结构如下:
select <JavaScript expression to select>
[ from [instanceof] <class name> <identifier>
[ where <JavaScript boolean expression> ] ]
可以查询对象的所有实例,实现了某个接口的所有实例,对象的实例数等。具体可以查询公开资料。
还以InMemoryWebSessionStore这个类举例,查看下系统当前所有的session信息。先看下这个类的源文件
org.springframework.web.server.session.InMemoryWebSessionStore
从源代码可以看出,系统的seesion存在InMemoryWebSessionStore对象的sessions属性里,是一个ConcurrentHashMap。
在jhat页面,下拉到最底部,点击“Execute Object Query Language (OQL) query”,打开OLQ页面
就像平时写sql一样,输入执行语句:
select s.sessions from org.springframework.web.server.session.InMemoryWebSessionStore s
点击执行 execute,得到查询结果节点查询结果,即可看到这个系统具体得session信息:
可以看出当前系统有1000个seesion。点击table,可以查看具体的session信息:
随便找一个对象,点击进去看看具体的session信息:
查看map value值
可以查看到session的创建时间和state等。这里看下创建时间
将上述时间毫秒值用再现转换工具可知,具体时间是2025-06-17 19:10:08
其他对象信息可以进一步进去看详情,这里篇幅有限不在演示示例。