当前位置: 首页 > news >正文

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

        http://www.dtcms.com/a/325628.html

        相关文章:

      • AI入门学习--如何写好prompt?
      • STM32学习笔记7-TIM输入捕获模式
      • 1000w小时语音数据!语音模型Higgs Audio V2情感能力跃迁;MathCaptcha10k提升验证码识别技术
      • 主DNS部署+辅助DNS服务器部署
      • 嵌入式学习(Day24)fread/fwrite
      • 【华为机试】208. 实现 Trie (前缀树)
      • 钓鱼鱼饵制作的方式
      • 【项目测试】:问卷考试系统项目测试报告
      • FlinkSql(详细讲解一)
      • C#中如何运用JWT用户认证
      • AT24C02C-SSHM-T用法
      • 什么情况下会导致日本服务器变慢?解决办法
      • 系统编程——消息队列
      • 前端实现 MD5 + AES 加密的安全登录请求
      • Nacos-1--什么是Nacos?
      • 疫情可视化:基孔肯雅热风险地图实战解析
      • Dubbo从入门到实战:分布式服务开发指南
      • WPF之绑定!
      • OpenCV计算机视觉实战(19)——特征描述符详解
      • 玩转Docker | 使用Docker部署Trilium Notes知识库工具
      • typecho博客设置浏览器标签页图标icon
      • 石材 × 设计:解锁永恒材质的四大灵感密码
      • 数据结构 双链表与LinkedList
      • 18.WEB 服务器
      • 超算中心的一台服务器上有多少个CPU,多少个核?
      • JVM基础【Java】
      • 力扣164:最大间距
      • 深入理解与灵活应用 std::optional
      • vue3中的子组件向父组件通信和父组件向子组件通信
      • python --nacos相关