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

最佳实践 #

  1. 生产环境使用注意事项

    • Arthas 会带来一定的性能开销,生产环境使用后应及时关闭
    • 避免在高并发场景下长时间使用跟踪类命令(如 trace、watch)
    • 不要随意使用 redefine 命令修改生产环境代码
  2. 高效定位问题

    • 先使用 dashboard 和 thread 命令了解系统整体状态
    • 再使用 sc 和 sm 命令定位到具体类和方法
    • 最后使用 trace、watch 等命令进行详细分析
  3. 命令组合使用

    • 使用 grep 过滤命令输出:thread | grep RUNNABLE
    • 使用管道符组合多个命令:sc *UserService* | xargs sm

常见问题 #

1. Arthas 无法连接到 Java 进程 #

  • 检查 Java 进程是否在运行
  • 检查当前用户是否有足够的权限
  • 检查是否有防火墙或安全策略限制
  • 尝试使用绝对路径启动 Arthas

2. 命令执行报错 #

  • 检查命令语法是否正确
  • 检查类名和方法名是否存在
  • 检查是否有足够的权限执行该命令
  • 查看 Arthas 日志获取详细错误信息

3. 热修复失败 #

  • 确保编译后的类与原类签名一致
  • 检查是否修改了类的结构(如添加新方法)
  • 避免修改正在执行的方法

参考资料 #

最后更新:2026-02-05