Arthas 诊断工具:线上问题的手术刀
Arthas 是阿里巴巴开源的 Java 诊断工具,被称为"线上问题的手术刀"。
当生产环境出问题,不能 debug,你只能靠日志和经验猜。但 Arthas 让你可以在不重启、不改代码的情况下,实时观察 JVM 内部发生的一切。
安装与启动
bash
# 方式1:下载 arthas-boot.jar 启动
java -jar arthas-boot.jar
# 方式2:直接 attach 到已运行的 Java 进程
java -jar arthas-boot.jar <pid>
# 方式3:在线安装(测试环境)
curl -L https://arthas.aliyun.com/install.sh | sh
./as.sh启动后选择一个 Java 进程,然后就可以敲命令了。
常用命令
dashboard:全局健康检查
bash
# 查看 JVM 整体状况:内存、线程、GC、运行信息
dashboard一眼看到哪块内存快满了、哪些线程在阻塞、GC 频率高不高。
thread:定位线程问题
bash
# 查看所有线程
thread
# 查看阻塞的线程(死锁)
thread -b
# 查看 CPU 占用最高的线程
thread -n 5
# 查看指定线程的堆栈
thread 1trace:追踪方法调用链路
这是最常用的命令,追踪一个方法的执行时间:
bash
# 追踪方法调用,按耗时排序
trace com.example.UserService getUser
# 只看超过 10ms 的调用
trace com.example.UserService getUser '#cost > 10'
# 包含子调用(多层)
trace -E com.example|service.* getUserwatch:观察方法出入参
bash
# 观察入参和返回值
watch com.example.UserService getUser '{params, returnObj}'
# 只看返回值
watch com.example.UserService getUser 'returnObj'
# 观察异常
watch com.example.UserService getUser '{params, throwExp}'
# 观察方法结束后(finally)
watch com.example.UserService getUser '{params, returnObj}' -x 3-x 3 表示展开深度为 3,方便看复杂对象。
jad:反编译
bash
# 反编译整个类
jad com.example.UserService
# 反编译单个方法
jad com.example.UserService getUserredefine:热更新
这是 Arthas 最强大的功能——修改正在运行的代码,不需要重启:
bash
# 先用 jad 反编译,修改字节码
# 然后重新加载
redefine /path/to/ModifiedClass.class热更新是临时修复,生产环境用完记得重新发版。
实战场景
场景1:接口响应慢
bash
# 追踪方法调用链路,找到最慢的节点
trace com.example.OrderService createOrder '#cost > 100'场景2:OOM 排查
bash
# 先看内存占用
dashboard
# 生成堆转储文件
heapdump /tmp/heap.hprof
# 用 MAT 分析堆文件找出大对象场景3:类加载问题
bash
# 查看类加载情况
classloader
# 查看特定类从哪个 ClassLoader 加载
sc -d com.example.UserService常用选项
| 选项 | 说明 |
|---|---|
-c <classLoaderClass> | 指定 ClassLoader |
-n <count> | 执行次数 |
#cost > n | 只看耗时超过 n ms 的 |
-x <depth> | 对象展开深度 |
--expressions | 使用正则表达式 |
总结
- trace 找慢方法:按耗时排序,一眼看出哪个环节拖后腿
- watch 看出入参:观察数据是否符合预期
- thread -b 找死锁:线程互相等待,一目了然
- jad + redefine 热修复:临时救火
Arthas 是排查生产问题的神器,但使用前要注意:对性能有轻微影响,排查完记得 quit。
