Skip to content

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 1

trace:追踪方法调用链路

这是最常用的命令,追踪一个方法的执行时间:

bash
# 追踪方法调用,按耗时排序
trace com.example.UserService getUser

# 只看超过 10ms 的调用
trace com.example.UserService getUser '#cost > 10'

# 包含子调用(多层)
trace -E com.example|service.* getUser

watch:观察方法出入参

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 getUser

redefine:热更新

这是 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使用正则表达式

总结

  1. trace 找慢方法:按耗时排序,一眼看出哪个环节拖后腿
  2. watch 看出入参:观察数据是否符合预期
  3. thread -b 找死锁:线程互相等待,一目了然
  4. jad + redefine 热修复:临时救火

Arthas 是排查生产问题的神器,但使用前要注意:对性能有轻微影响,排查完记得 quit。

基于 VitePress 构建