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
其他對象信息可以進一步進去看詳情,這里篇幅有限不在演示示例。