当生产环境卡成 PPT:Spring Boot 线程 Dump 捉妖指南 - 第544篇
悟纤文章(文章累计540+)
《国内最全的Spring Boot系列之一》
《国内最全的Spring Boot系列之二》
《国内最全的Spring Boot系列之三》
《国内最全的Spring Boot系列之四》
《国内最全的Spring Boot系列之五》
《国内最全的Spring Boot系列之六》
《国内最全的Spring Boot系列之七》
《国内最全的Spring Boot系列之八》
Docker中部署SpringBoot项目,超详细教程 - 第540篇
IDEA:别再用 StringBuilder 拼命了,用 + 吧 - 第541篇
实战派 Spring Boot:7个你一定用得上的技巧 - 第542篇
你以为你会写测试?Spring Boot 还藏了这些招!—让你的Spring Boot 测试不再只是“点个运行” - 第543篇
学 Spring Boot,就找悟纤!
导读
各位 Javaer 有没有遇到过这种场景:
白天业务跑得飞快,晚上突然就……卡了。客户电话打过来:
“你们系统怎么点一下就像在等 KTV 点歌机响应?”
此时,经验丰富的你默默扶了扶眼镜(或者敲了敲键盘),心里知道——八成是线程被绑架了。
那么问题来了:生产环境又不能重启,又不能随便 SSH 上去,怎么优雅地抓住这个捣蛋的线程?
答案就是——远程线程 Dump 分析!
线程 Dump 就像系统的“快照”,能告诉你每个线程在干嘛、在哪儿卡着、谁跟谁抱着不放(死锁)。
一、最轻量级:JDK 自带工具(JDK Mission Control / jcmd / jstack)
1.1 远程执行 jstack
如果生产机器能远程 SSH(比如跳板机),直接:
jstack <pid> > thread_dump.txt
但是——很多生产环境禁止直接 SSH,这时就可以用 jcmd + JMX 远程:
1.2用 JMX 远程获取线程 Dump
(1)启动时开启 JMX:
java -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar app.jar
(2)本地用 jcmd 或 JVisualVM 连接JMX,然后导出线程 Dump
然后用 JVisualVM 或 jcmd 远程连过去,点两下鼠标,咔嚓——线程 Dump 到手。
这就像是给生产环境装了一个监控摄像头,随时偷看 JVM 在干嘛。
⚠️小心别被安全同事看见,说你在“偷窥生产”。
✅优点:无需改代码,直接可用
⚠️ 缺点:JMX 端口要提前开,注意安全
二、中量级:Spring Boot Actuator Thread Dump
如果你的应用是Spring Boot,可以直接在生产暴露线程 Dump(配合权限限制)。
pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
application.yml
management:
endpoints:
web:
exposure:
include: threaddump, heapdump
访问:
GET http://your-domain/actuator/threaddump
l 返回 JSON 格式的线程信息
l /actuator/heapdump还可以获取堆转储文件(用 Eclipse MAT 分析)
直接 JSON 格式送到你面前,还支持 /heapdump 导出堆转储。
不过记住,不要裸奔在公网,不然别人也能看你家 JVM 里藏了什么。
✅优点:HTTP 获取,方便 CI/CD 集成⚠️ 缺点:必须加鉴权,防止敏感信息泄漏
三、重量级:持续监控 + 实时分析(适合大规模生产环境)
Arthas(阿里巴巴开源)
l 类似 Java 的“生产环境调试神器”
l支持 Attach 到 JVM 后执行:
thread # 查看线程堆栈
thread -n 10 # 查看 CPU 占用最高的 10 个线程
直接告诉你 CPU 占用最高的 10 个线程,还能跟踪方法调用、修改返回值,甚至在线反编译。
这就像是去生产机抓小偷,不光抓到了,还能当场审问:“你刚才在 synchronized 里干嘛?”
l 不需要预先开启 JMX,支持动态 attach
商业/专业监控工具
l YourKit Java Profiler(可远程 attach)
l Java Flight Recorder (JFR) + Mission Control(JDK 内置,低开销采样)
lNew Relic / Datadog APM(全链路可视化)
线程 Dump 分析要点
拿到 Dump 后,重点看:
(1)BLOCKED / WAITING 线程
l 找出死锁(Found one Java-level deadlock)
l 看 synchronized 锁住了什么
(2)RUNNABLE 且 CPU 高
l 可能是死循环、密集计算、I/O 阻塞
(3)频繁 Full GC 的线程
l 通常是 GC 日志里的 VM Thread 或GC task thread
🛡️ 分析姿势
拿到线程 Dump,别急着全看——先抓重点:
(1)BLOCKED / WAITING:这帮家伙在排队抢锁,可能死锁了
(2)RUNNABLE 且 CPU 飙高:多半是死循环或者在拼命算 Pi
(3)Found one Java-level deadlock:恭喜,抓到“互相拥抱不放手”的两个线程
安全建议
· 端口限制:JMX、Arthas、Actuator 都要限制访问 IP + 鉴权
· 敏感信息:线程堆栈里可能有明文密码、token,别随意发全量 Dump 给外部
· 高压场景慎用:Heap Dump 会冻结 JVM 数秒,建议低峰期操作
温馨提示
· 别在高峰期直接 Heap Dump,不然 JVM 会冷冻几秒,老板会冷眼几秒
· 线程Dump 里可能有密码和 token,记得打码
· 千万别为了好玩一直刷新线程 Dump,运维会来找你喝咖啡
总结
远程线程 Dump 就像是给 JVM 戴了个黑匣子,不管生产环境变成 PPT 还是卡在“加载中”,你都能在第一时间找到幕后黑手。
学会这招,以后别人还在一脸懵逼时,你已经在分析 BLOCKED 和 RUNNABLE 了。
毕竟,懂得捉妖,才能做一个快乐的程序员。
如果你觉得这篇文章有用,欢迎点赞、分享、转发、投喂瓜子🌰~
学Spring Boot,就找悟纤! 咱们下期见!
历史文章(文章累计530+)
《国内最全的Spring Boot系列之一》
《国内最全的Spring Boot系列之二》
《国内最全的Spring Boot系列之三》
《国内最全的Spring Boot系列之四》
《国内最全的Spring Boot系列之五》
《国内最全的Spring Boot系列之六》
《国内最全的Spring Boot系列之七》
《国内最全的Spring Boot系列之八》
Spring Boot实用小技巧10 - 第532篇
Spring Boot实用小技巧11 - 第533篇
Viggle Api上线V3-beta模型,圣诞节跳舞视频来临
Suno Api V4 - Suno Api系列教程,耗费1个星期,输出14篇文章
Viggle AI开放照片唱歌API,新年快乐唱起来
Docker入门篇[SpringBoot之Docker实战系列] - 第534篇
Docker 的安装和基本使用[SpringBoot之Docker实战系列] - 第535篇
国内最全的Spring Boot系列之八 —— 汇聚8年500多篇文章,值得收藏
Docker 基本概念[SpringBoot之Docker实战系列] - 第536篇
Docker 使用镜像[SpringBoot之Docker实战系列] - 第537篇
Docker 操作容器[SpringBoot之Docker实战系列] - 第538篇
Docker 仓库/私有仓库[SpringBoot之Docker实战系列] - 第539篇
Docker中部署SpringBoot项目,超详细教程 - 第540篇
IDEA:别再用 StringBuilder 拼命了,用 + 吧 - 第541篇
实战派 Spring Boot:7个你一定用得上的技巧 - 第542篇
你以为你会写测试?Spring Boot 还藏了这些招!—让你的Spring Boot 测试不再只是“点个运行” - 第543篇