
本文详解线程转储(Thread Dump)与堆转储(Heap Dump)的本质区别、适用场景,并介绍 Spring Boot Actuator 中 /actuator/threaddump 接口返回的 JSON 格式线程转储的高效分析方法与实用工具。
本文详解线程转储(thread dump)与堆转储(heap dump)的本质区别、适用场景,并介绍 spring boot actuator 中 `/actuator/threaddump` 接口返回的 json 格式线程转储的高效分析方法与实用工具。
在 Java 应用性能调优与故障排查中,线程转储(Thread Dump) 和 堆转储(Heap Dump) 是两类最基础、最关键的运行时诊断快照,但它们关注的维度截然不同:
-
线程转储(Thread Dump) 是 JVM 中所有 Java 线程在某一时刻的执行状态快照。它包含每个线程的名称、状态(如
RUNNABLE、BLOCKED、WAITING)、完整调用栈(stack trace)、锁持有/等待信息等。典型用途包括:定位死锁、识别长时间阻塞或高 CPU 占用线程、分析线程池饱和原因。例如,通过 Spring Boot Actuator 的GET /actuator/threaddump(需启用management.endpoints.web.exposure.include=threaddump),可直接获取结构化 JSON 格式的线程转储:
[
{
"threadName": "http-nio-8080-exec-1",
"threadState": "RUNNABLE",
"stackTrace": [
{ "className": "com.example.MyService", "methodName": "process", "lineNumber": 42 }
],
"lockedMonitors": [],
"lockedSynchronizers": []
}
]
-
堆转储(Heap Dump) 则是 JVM 堆内存的对象级快照,记录了某一时刻所有存活对象的类型、数量、大小、引用关系及 GC 根路径。它不包含执行逻辑,而是用于内存分析:识别内存泄漏(如未释放的静态集合、缓存膨胀)、评估对象生命周期、优化大对象分配。常见获取方式包括
jmap -dump:format=b,file=heap.hprof <pid></pid>或 JVM 启动参数-XX:+HeapDumpOnOutOfMemoryError。
⚠️ 关键区别速查表: | 维度 | 线程转储 | 堆转储 | |--------------|------------------------------|--------------------------------| | 关注焦点 | 执行流、并发状态、锁竞争 | 内存占用、对象分布、引用链 | | 数据粒度 | 线程 + 调用栈(文本/JSON) | 对象实例 + 字段引用(二进制
.hprof) | | 典型问题 | 死锁、线程饥饿、CPU 飙升 | OOM、内存泄漏、GC 频繁 | | 触发频率 | 可高频采集(毫秒级开销低) | 采集成本高(暂停应用,内存拷贝) |
对于 Actuator 返回的 JSON 格式线程转储,推荐分层分析策略:
基础可读性处理(IDE 内完成)
使用 IntelliJ IDEA 打开 JSON 文件后,自动触发 JSON 格式化(快捷键Ctrl+Alt+L/Cmd+Option+L),并利用结构导航(Ctrl+Click跳转字段、折叠展开层级)快速定位关键线程。注意:IDEA 本身不提供线程状态智能分析,但为人工筛查提供高效视图。-
深度诊断(专用工具)
-
FastThread.io(免费在线):上传 JSON 线程转储,自动生成可视化报告,高亮
BLOCKED线程、锁竞争链、线程状态分布图,支持多 dump 对比。 - Thread Dump Analyzer (TDA)(开源桌面工具):本地解析 JSON/XML/JStack 格式,提供线程分组、死锁检测、热点方法统计。
-
JDK 自带
jstack:若需原始文本格式(更兼容传统工具),可配合jstack <pid> > threaddump.txt</pid>获取。
-
FastThread.io(免费在线):上传 JSON 线程转储,自动生成可视化报告,高亮
-
生产环境最佳实践
- 避免单次采样:连续采集 3–5 个间隔 5 秒的线程转储,对比变化趋势(如某线程持续
RUNNABLE且栈顶方法不变,可能陷入无限循环)。 - 结合监控:将线程状态(如
BLOCKED数量)接入 Prometheus + Grafana,实现异常自动告警。 - 安全注意:Actuator 接口需严格鉴权(如 Spring Security 配置
/actuator/threaddump访问控制),避免敏感线程信息泄露。
- 避免单次采样:连续采集 3–5 个间隔 5 秒的线程转储,对比变化趋势(如某线程持续
最后需强调:线程转储与堆转储从不替代彼此。当遇到“服务响应慢”时,应先取线程转储判断是否卡在 I/O 或锁上;若伴随内存持续增长,则必须配合堆转储定位泄漏源头。二者协同,方能构建完整的 Java 应用可观测性闭环。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











