Arthas 参考文档 #
Arthas 简介 #
Arthas 是阿里巴巴开源的一款 Java 诊断工具,提供了丰富的命令行交互功能,可以帮助开发者快速定位和解决 Java 应用的各种问题。Arthas 基于 JVM 实现,可以在不修改应用代码的情况下,实时查看和修改 JVM 运行状态。
主要功能特性:
- 实时查看 JVM 内存、线程、GC 等运行状态
- 动态反编译和修改类文件
- 跟踪方法执行过程和参数
- 监控方法调用次数和耗时
- 查看和修改系统属性和环境变量
- 支持热修复代码
安装方法 #
1. 使用官方脚本安装 #
bash
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
2. 使用包管理器安装(Linux/macOS) #
bash
# 使用 Homebrew (macOS)
brew install arthas
# 使用 apt (Ubuntu/Debian)
sudo apt-get install arthas
# 使用 yum (CentOS/RHEL)
sudo yum install arthas
3. 手动下载安装 #
从 Arthas GitHub releases 页面 下载最新版本的 zip 包,解压后即可使用。
启动 Arthas #
1. 使用 arthas-boot 启动 #
arthas-boot 是 Arthas 提供的启动工具,可以自动检测当前机器上的 Java 进程,并提供选择界面:
bash
java -jar arthas-boot.jar
运行后会显示当前机器上的 Java 进程列表,输入对应的数字选择要诊断的进程:
text
[INFO] arthas-boot version: 3.7.0
[INFO] Found existing java process, please choose one and hit RETURN.
* [1]: 12345 com.example.Application
[2]: 67890 org.springframework.boot.loader.JarLauncher
2. 直接连接到指定进程 #
bash
java -jar arthas-boot.jar <pid>
3. 远程连接到其他机器 #
bash
# 在目标机器上启动 arthas tunnel server
java -jar arthas-tunnel-server.jar
# 在目标机器上启动 arthas agent 并连接到 tunnel server
java -jar arthas-boot.jar --tunnel-server 'ws://tunnel-server-host:7777/ws' --agent-id <agent-id>
# 在本地连接到 tunnel server
java -jar arthas-boot.jar --tunnel-server 'ws://tunnel-server-host:7777/ws' --agent-id <agent-id>
常用命令 #
1. 基础命令 #
| 命令 | 功能描述 |
|---|---|
help |
显示帮助信息 |
cls |
清屏 |
session |
查看当前会话信息 |
quit |
退出当前 Arthas 客户端 |
shutdown |
关闭 Arthas 服务端 |
2. JVM 相关命令 #
dashboard #
显示当前 JVM 的实时仪表盘,包括内存使用、线程状态、GC 情况等:
bash
dashboard
jvm #
查看 JVM 详细信息:
bash
jvm
thread #
查看线程信息,支持多种过滤和排序选项:
bash
# 查看所有线程状态
thread
# 查看 CPU 使用率最高的 5 个线程
thread -n 5
# 查看死锁线程
thread -b
# 查看指定线程的堆栈信息
thread <tid>
heapdump #
导出堆转储文件:
bash
heapdump /tmp/heapdump.hprof
gc #
查看 GC 统计信息:
bash
gc
3. 类和方法相关命令 #
sc #
查找 JVM 中已加载的类:
bash
# 查找所有包含 "User" 的类
sc *User*
# 查找指定包下的类
sc com.example.service.*
# 显示类的详细信息
sc -d com.example.service.UserService
sm #
查看类的方法信息:
bash
# 查看 UserService 类的所有方法
sm com.example.service.UserService
# 查看方法的详细信息
sm -d com.example.service.UserService getUserById
jad #
反编译指定类:
bash
# 反编译 UserService 类
jad com.example.service.UserService
# 反编译指定方法
jad com.example.service.UserService getUserById
mc #
编译 Java 文件:
bash
mc /tmp/UserService.java -d /tmp
redefine #
重新定义类,用于热修复:
bash
redefine /tmp/com/example/service/UserService.class
4. 方法监控和跟踪 #
monitor #
监控方法调用次数、成功率、平均耗时等:
bash
# 监控 UserService 类的所有方法,每 5 秒输出一次
monitor -c 5 com.example.service.UserService
# 监控指定方法
monitor -c 5 com.example.service.UserService getUserById
trace #
跟踪方法执行路径,显示方法调用栈和耗时:
bash
# 跟踪 UserService 类的 getUserById 方法
trace com.example.service.UserService getUserById
# 跟踪方法并过滤条件
trace com.example.service.UserService getUserById '#cost > 100'
watch #
观察方法的参数、返回值和异常:
bash
# 观察 getUserById 方法的参数和返回值
watch com.example.service.UserService getUserById '{params, returnObj}'
# 观察方法抛出的异常
watch com.example.service.UserService getUserById '{params, throwExp}' -e
# 观察方法执行前后的状态
watch com.example.service.UserService getUserById '{params, target, returnObj}' -b -s
stack #
查看方法的调用栈:
bash
# 查看 getUserById 方法的调用栈
stack com.example.service.UserService getUserById
tt #
时间隧道,可以记录和回放方法执行:
bash
# 记录 UserService 类的 getUserById 方法的 10 次调用
tt -t com.example.service.UserService getUserById -n 10
# 查看记录的调用列表
tt -l
# 回放指定记录的调用
tt -p -i 1000
典型使用场景 #
1. 定位高 CPU 使用率问题 #
bash
# 查看 CPU 使用率最高的 5 个线程
thread -n 5
# 查看指定线程的堆栈信息
thread <tid>
# 跟踪线程执行的方法
trace <class-name> <method-name>
2. 定位内存泄漏问题 #
bash
# 查看 JVM 内存使用情况
dashboard
# 导出堆转储文件
heapdump /tmp/heapdump.hprof
# 分析堆内存中的对象
heapdump --live /tmp/heapdump.hprof
3. 热修复代码 #
bash
# 反编译当前类
jad com.example.service.UserService > /tmp/UserService.java
# 修改 Java 文件后重新编译
mc /tmp/UserService.java -d /tmp
# 重新定义类
redefine /tmp/com/example/service/UserService.class
4. 监控方法性能 #
bash
# 监控方法调用情况
monitor -c 10 com.example.service.UserService
# 跟踪方法执行耗时
trace com.example.service.UserService getUserById '#cost > 50'
# 观察方法参数和返回值
watch com.example.service.UserService getUserById '{params, returnObj, cost}'
高级功能 #
1. 条件表达式 #
Arthas 支持使用 OGNL 表达式进行条件过滤和结果处理:
bash
# 过滤耗时超过 100ms 的方法调用
trace com.example.service.UserService getUserById '#cost > 100'
# 观察参数中 id 大于 100 的调用
watch com.example.service.UserService getUserById '{params, returnObj}' 'params[0] > 100'
# 格式化输出结果
watch com.example.service.UserService getUserById '"id: " + params[0] + ", result: " + returnObj.name'
2. 脚本支持 #
Arthas 支持使用 Groovy 脚本进行复杂操作:
bash
# 执行 Groovy 脚本
ognl '@java.lang.System@out.println("Hello Arthas")'
# 执行外部脚本
script --lang groovy /tmp/script.groovy
3. Web Console #
Arthas 提供了 Web 控制台,可以通过浏览器访问:
bash
# 启动时指定 Web 控制台端口
java -jar arthas-boot.jar --http-port 8563
然后通过浏览器访问:http://localhost:8563
4. 插件机制 #
Arthas 支持插件扩展,可以通过插件机制添加自定义功能:
bash
# 安装插件
plugin install <plugin-name>
# 卸载插件
plugin uninstall <plugin-name>
# 查看已安装插件
plugin list
退出 Arthas #
1. 退出客户端 #
bash
quit
2. 关闭服务端 #
bash
shutdown
最佳实践 #
-
生产环境使用注意事项:
- Arthas 会带来一定的性能开销,生产环境使用后应及时关闭
- 避免在高并发场景下长时间使用跟踪类命令(如 trace、watch)
- 不要随意使用 redefine 命令修改生产环境代码
-
高效定位问题:
- 先使用 dashboard 和 thread 命令了解系统整体状态
- 再使用 sc 和 sm 命令定位到具体类和方法
- 最后使用 trace、watch 等命令进行详细分析
-
命令组合使用:
- 使用 grep 过滤命令输出:
thread | grep RUNNABLE - 使用管道符组合多个命令:
sc *UserService* | xargs sm
- 使用 grep 过滤命令输出:
常见问题 #
1. Arthas 无法连接到 Java 进程 #
- 检查 Java 进程是否在运行
- 检查当前用户是否有足够的权限
- 检查是否有防火墙或安全策略限制
- 尝试使用绝对路径启动 Arthas
2. 命令执行报错 #
- 检查命令语法是否正确
- 检查类名和方法名是否存在
- 检查是否有足够的权限执行该命令
- 查看 Arthas 日志获取详细错误信息
3. 热修复失败 #
- 确保编译后的类与原类签名一致
- 检查是否修改了类的结构(如添加新方法)
- 避免修改正在执行的方法
参考资料 #
最后更新:2026-02-05