前置说明:
Arthas 启动命令:
java -jar arthas-boot.jar,选择你的 SpringBoot 进程所有命令可以保存为
arthas-script.as,批量执行:java -jar arthas-boot.jar -f arthas-script.as <pid>适合排查:CPU 高、慢接口、慢 SQL、线程阻塞、死锁、GC、方法入参返回值、异常、类加载
生产慎用
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
四、重要生产红线(必看)
高频接口禁止无限制 watch /trace,一定要加
-n 次数,优先--sample采样heapdump、profiler不要长时间跑,堆 dump 会触发 STW不要在压测高峰期长时间 attach arthas
Arthas 不能跨容器!K8s 要进到容器内部
kubectl exec -it pod -- bash再启动权限:JVM attach 需要同一个用户,root attach 普通用户进程会失败
五、常用参数速查
-n N:执行 N 次自动停止--sample N:每 N 次采样一次,降低开销-x N:对象展开深度(推荐 2,最大不要超过 3)-c 10:monitor 统计周期,单位秒
本文原创作者:易君召,详见:https://www.yijunzhao.cc/about,转载请注明出处。
原文链接
欢迎访问