Skip to content

第二章 Arthas(阿尔萨斯) v1.0 ​

官网:https://arthas.aliyun.com/

第一部分 快速入门 ​

一、安装与启动 ​

1.安装方式 ​

bash
curl -O https://arthas.aliyun.com/arthas-boot.jar
bash
wget https://arthas.aliyun.com/arthas-boot.jar
bash
# 从GitHub Release下载
https://github.com/alibaba/arthas/releases

2.启动Arthas ​

bash
# 启动arthas-boot.jar
java -jar arthas-boot.jar

# 也可以指定进程ID启动
java -jar arthas-boot.jar <pid>

启动后会显示Java进程列表,选择要诊断的进程即可。

提示

Arthas会自动attach到目标Java进程,无需重启应用~

二、常用命令 ​

1.基础命令 ​

命令说明
help查看帮助信息
version查看Arthas版本
cls清屏
quit/exit退出当前连接
stop关闭Arthas Server(完全退出)

2.系统命令 ​

命令说明
dashboard实时面板(线程、内存、GC等)
thread查看线程信息
jvm查看JVM信息
sysprop查看系统属性
sysenv查看系统环境变量

第二部分 核心功能 ​

一、监控与诊断 ​

1.dashboard命令 ​

实时监控面板,显示线程、内存、GC、运行环境等信息:

bash
dashboard

输出示例:

ID   NAME                          GROUP          DAEMON   PRIORITY  STATE    %CPU   DELTA_TIME TIME      INTERRUPT DAEMON
1    main                          main           false    5         WAITING  0.0    0.000      0:0.000   false     true
2    Reference Handler             system         true     10        WAITING  0.0    0.000      0:0.000   false     true
...

2.thread命令 ​

查看线程堆栈信息:

bash
# 查看所有线程
thread

# 查看指定ID的线程
thread <id>

# 查看最忙的前N个线程
thread -n 3

# 查看CPU使用率最高的线程
thread -b

3.watch命令 ​

实时观察方法执行数据:

bash
# 观察方法返回值
watch com.example.UserService getUser '{returnObj}' -x 2

# 观察方法入参和返回值
watch com.example.UserService getUser '{params, returnObj}' -x 2

# 观察异常信息
watch com.example.UserService getUser '{params, throwExp}' -e -x 2

参数说明:

  • -x 2:展开对象的层数
  • -e:只观察异常
  • -b:方法调用前观察
  • -n 5:只执行5次

4.trace命令 ​

方法内部调用路径,输出方法路径上的每个节点的耗时:

bash
trace com.example.UserService getUser

5.stack命令 ​

输出方法的调用路径:

bash
stack com.example.UserService getUser

二、类与方法操作 ​

1.sc命令 ​

查看已加载的类:

bash
# 搜索类
sc com.example.*

# 查看类的详细信息
sc -d com.example.UserService

2.sm命令 ​

查看已加载的方法:

bash
# 查看类的方法
sm com.example.UserService

# 查看方法详情
sm -d com.example.UserService getUser

3.jad命令 ​

反编译已加载的类:

bash
jad com.example.UserService

4.mc命令 ​

内存编译Java源码:

bash
mc /tmp/UserService.java

5.redo命令 ​

重新加载修改后的类:

bash
# 重新加载类
redefine /tmp/com/example/UserService.class

三、高级功能 ​

1.ognl表达式 ​

使用OGNL表达式执行代码:

bash
# 调用静态方法
ognl '@java.lang.Math@random()'

# 获取静态字段
ognl '@java.lang.System@out'

# 调用实例方法
ognl '#userService=beanFactory.getBean("userService"), #userService.getUser(1)'

2.管道与重定向 ​

Arthas支持管道操作:

bash
# 过滤输出
thread | grep main

# 结果重定向到文件
jad com.example.UserService > /tmp/UserService.java

第三部分 实战场景 ​

一、排查CPU飙高 ​

bash
# 1. 查看CPU使用率最高的线程
thread -n 3

# 2. 查看该线程的堆栈信息
thread <id>

# 3. 使用trace分析方法耗时
trace com.example.UserService getUser

二、排查死锁 ​

bash
# 1. 查看所有线程状态
thread

# 2. 查看阻塞线程
thread -b

# 3. 查看死锁信息
thread --state BLOCKED

三、排查内存泄漏 ​

bash
# 1. 查看内存使用情况
dashboard

# 2. 查看堆内存
memory

# 3. 使用heapdump导出堆快照
heapdump /tmp/heapdump.hprof

四、排查方法调用异常 ​

bash
# 1. watch观察异常
watch com.example.UserService getUser '{params, throwExp}' -e -x 2

# 2. trace分析调用链
trace com.example.UserService getUser

第四部分 注意事项 ​

一、生产环境使用建议 ​

  1. 权限控制:只在需要时启动,使用完毕后及时停止
  2. 性能影响:watch/trace等命令会对性能有一定影响,避免在高频接口上长期使用
  3. 安全风险:Arthas可以执行任意代码,注意安全防护

二、常见问题 ​

[Q: 无法attach到目标进程?]
  1. 确保Arthas和目标Java进程使用相同用户启动
  2. 检查是否有防火墙或安全策略限制
  3. 尝试使用root权限启动
[Q: 命令执行报错?]
  1. 检查类名和方法名是否正确
  2. 确认类已经被ClassLoader加载
  3. 检查参数格式是否正确