jhat 是 jdk 7/8 自带的堆转储分析工具,通过内置 http 服务器展示对象引用、类统计等,但 jdk 9 起废弃、jdk 11 已移除,现推荐 eclipse mat 或 jmc。

jhat 是 JDK 自带的堆内存分析工具,用于解析 .hprof 堆转储文件并启动一个内置 HTTP 服务器,供浏览器查看对象引用关系、类统计、实例查询等。不过需注意:**jhat 已在 JDK 9 中被标记为废弃(deprecated),JDK 11 及以后版本已移除**。当前更推荐使用 JVisualVM、JDK Mission Control(JMC) 或开源工具如 Eclipse MAT。但若你仍在使用 JDK 7/8,或需快速命令行分析,jhat 仍有实用价值。
准备堆转储文件(.hprof)
确保已有有效的堆转储文件,常见获取方式:
- 应用 OOM 时自动导出:启动参数加
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dumps/ - 运行中手动触发:
jmap -dump:format=b,file=heap.hprof <pid></pid> - 使用 JVisualVM 或 JMC 连接后“生成堆转储”
确认文件大小合理(过大可能导致 jhat 启动失败或内存溢出),建议先用 file heap.hprof 或 jhat -help 验证格式兼容性。
运行 jhat 并启动 Web 分析界面
在终端执行:
jhat -port 7000 -J-Xmx4g heap.hprof
-
-port 7000:指定 Web 服务端口(默认 7000,可改) -
-J-Xmx4g:为 jhat 进程分配足够堆内存(强烈建议!否则解析大文件易报OutOfMemoryError) - 输出类似
Server is ready.后,打开浏览器访问http://localhost:7000
页面加载可能较慢(尤其 >500MB 的文件),耐心等待。首次加载完成即进入主分析页。
关键分析页面与内存泄漏定位技巧
浏览器中重点关注以下链接:
- “All classes including platform”**:查看所有类的实例数和总占用大小。按
instances或bytes排序,找异常多的自定义类(如com.example.CacheEntry实例达百万级) - “Show instance counts for all classes (including platform)”**:更简洁的类统计表,适合快速扫视
- “Find the cumulative size of all instances of a given class”**:输入类名(如
java.util.ArrayList),查看其所有实例总大小 —— 若某业务类持有了大量 ArrayList,可能是缓存未清理 - “Show instance data for all objects of a given class”**:列出该类所有实例的字段值(慎用,大数据量会卡死)。可用于查具体对象内容,比如看某个
UserSession的lastAccessTime是否全为 null 或极旧时间 - “Show nearest GC root for a given object”**:选中某个可疑对象(通过上一步链接跳转后点击对象地址),点此查看它到 GC Root 的引用链 —— 这是定位泄漏根源的核心!常见泄漏路径如:
ThreadLocalMap → ThreadLocal → MyCache → ArrayList → Object
替代方案与注意事项
jhat 功能有限且交互体验差,实际排查中建议:
- 优先用 Eclipse MAT:支持支配树(Dominator Tree)、泄漏疑点报告(Leak Suspects)、OQL 查询,响应快、可视化强
- JDK 9+ 用户直接用 jcmd
VM.native_memory summary 或 JFR(Java Flight Recorder) 配合 JMC 分析运行时内存行为 - jhat 不支持分代信息、线程栈、本地方法栈分析,无法替代
jstack或jstat - 若 jhat 启动报错
java.lang.OutOfMemoryError: Java heap space,必须增大-J-Xmx;若报Invalid HPROF file,说明文件损坏或非标准格式(如被截断、非 JVM 生成)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











