当生产环境卡成 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篇

相关推荐
sql2008help1 小时前
使用spring-boot-starter-validation实现入参校验
java·开发语言
Mr_Air_Boy1 小时前
springboot集成xxl-job
java·spring boot·spring
Babybreath-2 小时前
Tomcat
java·tomcat
摇滚侠2 小时前
面试实战 问题二十三 如何判断索引是否生效,什么样的sql会导致索引失效
java
江影影影4 小时前
Spring Boot 2.6.0+ 循环依赖问题及解决方案
java·spring boot·后端
快乐就是哈哈哈4 小时前
《JSR303 数据校验全攻略:从入门到实战,玩转优雅的参数验证》
后端
快乐就是哈哈哈4 小时前
Linux 部署与管理 Spring Boot 项目保姆级全流程
后端
codeGoogle5 小时前
昇腾揭开的伤疤,刺痛了谁?
后端
null不是我干的5 小时前
黑马SpringBoot+Elasticsearch作业2实战:商品搜索与竞价排名功能实现
spring boot·后端·elasticsearch