------------------------------------------------------------------------------------------------------------
jmap 导出的服务器堆转储文件(.hprof 格式),可以在本地使用专门的 Java 堆分析工具。以下是详细步骤和常用工具:一、将服务器的 dump 文件传输到本地
.hprof 文件下载到本地,可通过 scp 命令(Linux/Mac)或工具(如 Xftp、WinSCP)传输:# 示例:从服务器下载 dump 文件到本地当前目录
scp 用户名@服务器IP:/path/to/dumpfile.hprof ./
二、本地查看工具推荐
1. JDK 自带工具:jhat(简单但功能有限)
jhat(Java Heap Analysis Tool)可以解析 .hprof 文件并通过浏览器查看。步骤:# 1. 启动 jhat 分析 dump 文件(默认端口 7000)
jhat -J-Xmx2g dumpfile.hprof # -J-Xmx2g 避免内存不足(根据 dump 文件大小调整)# 2. 浏览器访问 http://localhost:7000 查看分析结果
2. Eclipse MAT(Memory Analyzer Tool,推荐)
-
下载安装:官网:https://www.eclipse.org/mat/downloads.php(可选择独立版本,无需安装 Eclipse)
-
打开 dump 文件:启动 MAT →
File → Open Heap Dump...→ 选择本地.hprof文件。 -
常用分析功能:
- Leak Suspects:自动检测可能的内存泄漏点。
- Histogram:按类统计对象数量和内存占用。
- Dominator Tree:查看对象的内存支配关系(哪些对象占用大量内存)。
- Thread Overview:查看线程信息及关联的对象。
3. VisualVM(功能全面,操作简单)
-
启动 VisualVM:
- JDK 8 及以下:
JDK安装目录/bin/jvisualvm.exe(Windows)或jvisualvm(Linux/Mac)。 - JDK 9+:从 https://visualvm.github.io/ 下载安装。
- JDK 8 及以下:
-
导入 dump 文件:左侧导航栏 → 右键
Local→Load...→ 选择.hprof文件。 -
分析功能:
- Overview:堆内存概览。
- Classes:类的内存占用统计。
- Instances:查看具体对象实例及引用关系。
- Threads:线程快照(若 dump 包含线程信息)。
4. IntelliJ IDEA 内置分析器(适合开发场景)
.hprof 文件:步骤:- 打开 IDEA → 菜单栏
File → Open...→ 选择.hprof文件。 - 自动进入内存分析视图,支持查看对象、类、引用关系等(功能类似 MAT,但集成在 IDE 中更方便)。
三、注意事项
- 内存需求:分析大型 dump 文件(如几 GB)时,工具需要足够的内存(建议配置工具的堆内存,如 MAT 可修改
MemoryAnalyzer.ini中的-Xmx参数)。 - 文件格式:确保
.hprof文件是完整的(传输过程中未损坏),否则工具可能无法解析。 - JDK 版本兼容:尽量使用与生成 dump 文件时相同或更高版本的 JDK 工具,避免格式不兼容问题。
- 下载独立版本:访问 VisualVM 官方下载页,根据系统选择对应的安装包,Windows 系统直接下载压缩包格式(如 <代码开始> visualvm_218.zip < 代码结束 >)。
- 解压并配置(可选):将下载的压缩包解压到任意目录(比如 <代码开始> D:\Program Files\visualvm < 代码结束 >)。若启动时提示找不到 JDK,可进入解压目录的 < 代码开始 > etc < 代码结束 > 文件夹,编辑 < 代码开始 > visualvm.conf < 代码结束 > 文件,找到 < 代码开始 > visualvm_jdkhome < 代码结束 > 配置项,填写本地 JDK 的安装路径,示例如下:
ini
visualvm_jdkhome="D:\Program Files\jdk-17" - 启动工具:进入解压目录的 <代码开始> bin < 代码结束 > 文件夹,直接双击 < 代码开始 > visualvm.exe < 代码结束 > 就能启动工具。启动后,操作和 JDK 内置版本完全一致,可正常导入 < 代码开始 >.hprof < 代码结束 > 堆 dump 文件进行分析。
------------------------------------------------------------------------------------------------------------
一、线程 Dump(Thread Dump)
生成方式:
1. 使用 jstack 命令(最常用)
jstack 是 JDK 自带工具,需知道目标 Java 进程的 PID(进程 ID)。# 1. 查看 Java 进程 PID(找到目标进程)
jps -l # 列出所有 Java 进程(PID + 主类名)
# 或用系统命令:ps -ef | grep java# 2. 生成线程 Dump 到文件
jstack <PID> > thread_dump.txt
- 示例:
jstack 12345 > thread_dump_20251111.txt(12345 是进程 PID)。 - 若进程无响应(如死锁),可加
-F强制生成:jstack -F 12345 > thread_dump.txt。
2. 使用 Arthas 工具
# 1. 启动 Arthas 并 attach 到目标进程(见前文 Arthas 教程)
java -jar arthas-boot.jar# 2. 生成线程 Dump 到文件
jstack > thread_dump.txt
3. 应用内代码生成
Thread 类的方法生成(适合嵌入应用监控):// 获取所有线程的栈信息
Map<Thread, StackTraceElement[]> allStackTraces = Thread.getAllStackTraces();
// 写入文件(示例代码)
try (FileWriter writer = new FileWriter("thread_dump.txt")) {for (Map.Entry<Thread, StackTraceElement[]> entry : allStackTraces.entrySet()) {Thread thread = entry.getKey();writer.write("Thread: " + thread.getName() + " (ID: " + thread.getId() + ")\n");for (StackTraceElement element : entry.getValue()) {writer.write("\t" + element + "\n");}}
} catch (IOException e) {e.printStackTrace();
}
二、内存 Dump(Heap Dump)
生成方式:
1. 使用 jmap 命令(JDK 自带)
# 1. 查看进程 PID(同线程 Dump)
jps -l# 2. 生成内存 Dump 到文件(格式:.hprof)
jmap -dump:format=b,file=heap_dump.hprof <PID>
format=b:表示二进制格式(标准格式,可被 MAT、VisualVM 等工具解析)。- 示例:
jmap -dump:format=b,file=heap_dump_20251111.hprof 12345。 - 注意:生成内存 Dump 会暂停 JVM 服务(时间取决于堆大小),生产环境建议低峰期执行。
2. JVM 参数自动生成(OOM 时)
OutOfMemoryError 时自动生成内存 Dump:# 启动 Java 程序时添加参数
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump/heap_dump.hprof -jar app.jar
-XX:+HeapDumpOnOutOfMemoryError:OOM 时自动生成 Dump。-XX:HeapDumpPath:指定 Dump 文件保存路径(默认当前目录)。
3. 使用 VisualVM 工具(图形化)
- 启动 JDK 自带的
jvisualvm(命令行输入jvisualvm)。 - 在左侧 “应用程序” 中找到目标进程,右键选择 “堆 Dump”,自动生成并打开内存快照。
4. 使用 Arthas 工具
# 在 Arthas 终端中执行
heapdump /path/to/heap_dump.hprof
# 可选参数:-live 只 dump 存活对象(减少文件大小)
heapdump -live /path/to/live_heap_dump.hprof
三、其他常用 Dump
-
GC 日志(非 Dump 文件,但用于分析 GC 问题)通过 JVM 参数开启 GC 日志输出:bash
java -Xlog:gc*:file=gc.log:time,level,tags -jar app.jar(JDK 9+ 语法,JDK 8 及以下用-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log) -
系统信息 Dump使用
jinfo查看 JVM 配置信息:bashjinfo <PID> > jvm_config.txt # 导出 JVM 系统属性和参数
四、注意事项
- 权限问题:生成 Dump 的用户需与目标 Java 进程的用户权限一致,否则可能失败。
- 文件大小:内存 Dump 大小接近堆内存使用量(如 4GB 堆可能生成 4GB Dump 文件),确保磁盘空间充足。
- 生产环境影响:
jmap生成内存 Dump 时会暂停 JVM(“Stop The World”),建议在低峰期执行,或使用-XX:+HeapDumpOnOutOfMemoryError自动捕获 OOM 场景。 - 分析工具:
- 线程 Dump:可直接查看文本,或用 FastThread 在线分析。
- 内存 Dump:推荐用 MAT(Eclipse Memory Analyzer) 或 VisualVM 分析。
jstack(线程 Dump)和 jmap(内存 Heap Dump)文件,需根据文件类型选择合适的工具。以下是具体方法:一、查看 jstack 线程 Dump 文件(文本类)
jstack 生成的线程 Dump 是文本文件(通常以 .txt 结尾),包含所有线程的调用栈、状态、锁信息等,可直接查看或用工具辅助分析。1. 直接查看(简单场景)
- 线程状态(
RUNNABLE/BLOCKED/WAITING等)。 - 锁信息(如
locked <0x000000008xxxxxxx>表示持有锁,waiting to lock <0x000000008xxxxxxx>表示等待锁)。 - 调用栈(定位具体代码行,排查阻塞点)。
2. 专业工具分析(复杂场景)
-
FastThread(在线工具,推荐)网址:https://fastthread.io/操作:上传线程 Dump 文件,自动生成分析报告(包含死锁检测、线程状态统计、热点方法等),无需安装,适合快速排查。
-
VisualVM(本地工具,JDK 自带)步骤:
- 本地启动
jvisualvm(JDK 安装目录的bin文件夹下,如C:\Program Files\Java\jdk1.8.0_301\bin\jvisualvm.exe)。 - 左侧导航栏右键 “文件” → “加载”,选择下载的线程 Dump 文本文件。
- 在 “线程” 标签页查看线程状态、调用栈,支持按状态筛选(如只看
BLOCKED线程)。
- 本地启动
-
TDA(Thread Dump Analyzer)开源工具,专注线程分析,可下载安装:https://github.com/irockel/TDA。
二、查看 jmap 内存 Heap Dump 文件(二进制类)
jmap 生成的内存 Dump 是二进制文件(通常以 .hprof 结尾),包含堆中所有对象信息,需用支持二进制解析的工具查看。1. MAT(Eclipse Memory Analyzer,推荐)
.hprof 格式,功能强大。步骤:- 下载安装:https://www.eclipse.org/mat/downloads.php(选择对应系统版本)。
- 启动 MAT,点击 “File → Open Heap Dump”,选择下载的
.hprof文件。 - 选择分析模式(推荐 “Leak Suspects Report”,自动生成内存泄漏可疑点报告)。
- 关键分析点:
- Dominator Tree:查看占用内存最多的对象。
- Histogram:按类统计对象数量和内存占用。
- Leak Suspects:自动标记可能的内存泄漏点。
2. VisualVM(JDK 自带,轻量)
- 启动
jvisualvm,左侧导航栏右键 “文件” → “加载”,选择.hprof文件。 - 查看:
- 摘要:堆大小、对象总数等概览。
- 类:按类名统计对象数量和内存占比。
- 实例:查看具体对象的属性和引用关系(需手动筛选)。
3. JProfiler(商业工具,功能全面)
- 下载安装:https://www.ej-technologies.com/products/jprofiler/overview.html(可试用)。
- 启动后选择 “Open Snapshot”,加载
.hprof文件,分析内存分布、对象引用链等。
三、注意事项
-
文件大小:内存 Dump 文件可能很大(如几 GB),打开前确保本地磁盘有足够空间,且工具配置了足够的内存(如 MAT 需在
MemoryAnalyzer.ini中调整-Xmx参数,建议设置为大于 Dump 文件的大小)。示例(MAT 配置):在安装目录找到MemoryAnalyzer.ini,修改--launcher.XXMaxPermSize 1024m和-Xmx2048m(根据文件大小调整)。 -
JDK 版本兼容:尽量使用与生成 Dump 文件时相同或更高版本的 JDK 工具,避免因版本差异导致解析失败。
-
服务器与本地环境:无需在本地部署相同的应用代码,工具可直接解析 Dump 文件,但如果需要关联源码定位问题,需在工具中配置源码路径(如 MAT 中 “Window → Preferences → Java → Source Attachment”)。
------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------