小易说IT 小易说IT

SpringBoot Arthas 线上排查脚本合集

前置说明:

  1. Arthas 启动命令:java -jar arthas-boot.jar,选择你的 SpringBoot 进程

  2. 所有命令可以保存为 arthas-script.as,批量执行:java -jar arthas-boot.jar -f arthas-script.as <pid>

  3. 适合排查:CPU 高、慢接口、慢 SQL、线程阻塞、死锁、GC、方法入参返回值、异常、类加载

  4. 生产慎用 watch/trace 长时间监听高频方法,会增加 CPU 开销;优先 tt 或者采样模式

一、一键脚本 arthas-script.as(可直接复制保存)

# ==============================================
# Arthas 排查脚本 SpringBoot 专用
# 执行方式:java -jar arthas-boot.jar -f arthas-script.as 进程号
# ==============================================

# 1. 基础概览:JVM、线程、内存
version
dashboard -n 5
jvm
sysprop
sysenv

# 2. 线程排查:CPU高、死锁、阻塞
thread -n 10                   # 打印CPU占比最高前10个线程栈
thread -b                      # 找阻塞其他线程的锁(死锁重点)
thread --state BLOCKED         # 只看阻塞线程

# 3. GC 查看
gc                             # 单次GC统计
gc -n 3 2000                   # 每2s打印一次GC,共3次

# 4. 类&方法搜索(Spring Controller / Service)
sc -d com.example.demo.controller.*Controller
sm com.example.demo.controller.DemoController *

# 5. trace 慢接口(核心!看链路耗时,采样模式降低开销)
# 格式:trace 类名 方法名 -n 5 --sample 10
trace com.example.demo.controller.DemoController queryData -n 5 --sample 10

# 6. watch 观察入参、返回值、异常(按需开启,高频接口别常开)
# -x 2 展开层级,-n 3 只捕获3次就停,防止刷屏
watch com.example.demo.controller.DemoController queryData "{params,returnObj,throwExp}" -n 3 -x 2

# 7. tt 时间隧道(记录调用,可回放,适合偶发问题)
tt -t com.example.demo.controller.DemoController queryData -n 5

# 8. 反编译查看线上代码是否是预期版本
jad com.example.demo.controller.DemoController

# 9. 监控方法QPS、rt、异常率(monitor)
monitor com.example.demo.controller.DemoController queryData -c 10

# 10. 查看SpringBean(非常好用,确认Bean是否注入、AOP是否生效)
bean --name demoController

# 11. 退出
quit

⚠️ 修改提示:把 com.example.demo.controller.DemoController 替换成你自己的业务类

二、分场景独立命令(按需复制,不用跑全脚本)

场景 1:CPU 飙升排查(最常用)

# 1. 启动arthas后,先看top线程
thread -n 20

# 2. 如果怀疑某个方法CPU高,用trace看内部耗时
trace com.xxx.service.XXXService heavyCalcMethod -n 10 --sample 20

# 3. 配合profiler火焰图(强烈推荐,arthas内置async-profiler)
profiler start --event cpu
# 压测/等待30s后执行
profiler stop --file /tmp/cpu-flame.html

profiler 火焰图导出的 html 下载到本地浏览器打开,一眼定位热点方法

场景 2:接口响应慢、超时(慢链路排查)

# trace 整条调用链路,打印子调用耗时,--sample 采样降低性能损耗
trace com.xxx.controller.OrderController createOrder -n 8 --sample 15

# monitor 统计 10s 周期内:QPS、平均RT、最大RT、异常数
monitor com.xxx.controller.OrderController createOrder -c 10

场景 3:偶发报错、很难复现,想看入参和异常

# throwExp 捕获异常,-n 5捕获5次自动停止,避免打满日志
watch com.xxx.controller.OrderController createOrder "{params,returnObj,throwExp}" -n 5 -x 2
  • params:入参

  • returnObj:返回值

  • throwExp:异常堆栈

  • -x 2 对象展开层级,不要设置太大(-x 4 高频接口 CPU 爆炸)

场景 4:死锁、线程卡死、连接池耗尽

# 直接找阻塞锁,发现死锁
thread -b

# 查看所有阻塞状态线程
thread --state BLOCKED

# 查看等待状态线程(数据库连接池、redis连接等待)
thread --state WAITING

场景 5:怀疑线上包不是最新、代码被覆盖、AOP 没生效

# 反编译
jad com.xxx.controller.OrderController

# 查看类加载器
sc -d com.xxx.controller.OrderController

场景 6:GC 频繁、FullGC、内存泄漏排查

# 持续观察GC,每2s输出一次,共5次
gc -n 5 2000

# 堆快照(生产谨慎!dump会STW)
heapdump --live /tmp/heap.hprof

heap.hprof 下载本地用 MAT / JProfiler 分析内存泄漏

场景 7:查看 Spring Bean,排查注入、动态代理问题(SpringBoot 专属)

Arthas 3.6+ 支持 bean 命令,依赖 spring-context

# 模糊查询bean
bean --name *Order*

# 查看bean详情,代理类、实例
bean --name orderController

场景 8:动态修改日志级别(不用重启服务!SpringBoot 日志神器)

# 把com.xxx包日志改成DEBUG
logger --name com.xxx --level DEBUG
# 改回INFO
logger --name com.xxx --level INFO
# 查看当前日志配置
logger

三、Arthas 启动脚本(一键 attach,linux 线上)

start-arthas.sh

#!/bin/bash
# 下载arthas,只需要第一次
# curl -O https://arthas.aliyun.com/arthas-boot.jar

# 自动找到springboot进程,这里假设jar包名包含app
PID=$(pgrep -f "app.jar")
if [ -z "$PID" ];then
    echo "未找到进程"
    exit 1
fi
echo "attach pid: $PID"
java -jar arthas-boot.jar $PID

四、重要生产红线(必看)

  1. 高频接口禁止无限制 watch /trace,一定要加 -n 次数,优先 --sample 采样

  2. heapdump、profiler 不要长时间跑,堆 dump 会触发 STW

  3. 不要在压测高峰期长时间 attach arthas

  4. Arthas 不能跨容器!K8s 要进到容器内部 kubectl exec -it pod -- bash 再启动

  5. 权限:JVM attach 需要同一个用户,root attach 普通用户进程会失败

五、常用参数速查

  • -n N:执行 N 次自动停止

  • --sample N:每 N 次采样一次,降低开销

  • -x N:对象展开深度(推荐 2,最大不要超过 3)

  • -c 10:monitor 统计周期,单位秒


本文原创作者:易君召,详见:https://www.yijunzhao.cc/about,转载请注明出处。

原文链接 https://www.yijunzhao.cc/archives/springboot-arthas-production-troubleshooting-script-collection

欢迎访问 https://www.yijunzhao.cc/

https://www.yijunzhao.cc/