第二章 Arthas(阿尔萨斯) v1.0
第一部分 快速入门
一、安装与启动
1.安装方式
bash
curl -O https://arthas.aliyun.com/arthas-boot.jarbash
wget https://arthas.aliyun.com/arthas-boot.jarbash
# 从GitHub Release下载
https://github.com/alibaba/arthas/releases2.启动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 -b3.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 getUser5.stack命令
输出方法的调用路径:
bash
stack com.example.UserService getUser二、类与方法操作
1.sc命令
查看已加载的类:
bash
# 搜索类
sc com.example.*
# 查看类的详细信息
sc -d com.example.UserService2.sm命令
查看已加载的方法:
bash
# 查看类的方法
sm com.example.UserService
# 查看方法详情
sm -d com.example.UserService getUser3.jad命令
反编译已加载的类:
bash
jad com.example.UserService4.mc命令
内存编译Java源码:
bash
mc /tmp/UserService.java5.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第四部分 注意事项
一、生产环境使用建议
- 权限控制:只在需要时启动,使用完毕后及时停止
- 性能影响:watch/trace等命令会对性能有一定影响,避免在高频接口上长期使用
- 安全风险:Arthas可以执行任意代码,注意安全防护
二、常见问题
[Q: 无法attach到目标进程?]
- 确保Arthas和目标Java进程使用相同用户启动
- 检查是否有防火墙或安全策略限制
- 尝试使用root权限启动
[Q: 命令执行报错?]
- 检查类名和方法名是否正确
- 确认类已经被ClassLoader加载
- 检查参数格式是否正确