Appearance
Arthas 安装与使用
本文档介绍 Arthas 在 Linux 环境下的安装和使用方法。Arthas 是阿里巴巴开源的 Java 诊断工具,可以帮助开发者排查线上问题、进行性能分析和故障诊断。
1 Arthas 简介
1.1 什么是 Arthas
Arthas 是 Alibaba 开源的 Java 诊断工具,当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到 JVM 的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
1.2 主要功能
- 仪表板 - 查看线程、内存、GC、运行环境信息等
- 类加载信息 - 查看类加载信息,解决类冲突问题
- 方法监控 - 监控方法的入参、返回值、异常信息
- 反编译 - 反编译查看类的源码
- 性能分析 - 生成火焰图,分析性能瓶颈
- 热更新 - 实时修改代码,无需重启应用
1.3 官方资源
- 官方网站: https://arthas.aliyun.com/
- GitHub: https://github.com/alibaba/arthas
- 文档: https://arthas.aliyun.com/doc/
2 安装 Arthas
2.1 环境要求
- JDK 版本: 1.8 及以上
- Linux 操作系统(推荐 CentOS 7/Ubuntu)
- 目标 Java 进程必须正在运行
2.2 快速安装(推荐)
2.2.1 使用 arthas-boot 安装
这是最简单的安装方式,只需下载 arthas-boot.jar 即可:
bash
# 下载 arthas-boot.jar
curl -O https://arthas.aliyun.com/arthas-boot.jar
# 或者使用 wget
wget https://arthas.aliyun.com/arthas-boot.jar2.2.2 启动 Arthas
bash
# 使用 java -jar 启动
java -jar arthas-boot.jar首次启动时,会自动下载最新版本的 Arthas 完整包,并解压到 ~/.arthas/lib/ 目录下。
启动后,会显示当前运行的 Java 进程列表,选择需要诊断的进程编号即可:
bash
[INFO] arthas-boot version: 3.7.1
[INFO] Found existing java process, please choose one and input the serial number.
* [1]: 12345 com.example.Application
[2]: 23456 org.apache.catalina.startup.Bootstrap
[3]: 34567 com.jpwise.JpwiseApplication输入序号并回车,即可连接到对应的 Java 进程。
2.3 完整安装
如果需要离线安装或希望使用特定版本,可以下载完整安装包:
bash
# 下载完整安装包
wget https://github.com/alibaba/arthas/releases/download/arthas-all-3.7.1/arthas-bin.zip
# 解压
unzip arthas-bin.zip -d /opt/arthas
# 进入目录
cd /opt/arthas启动方式:
bash
# 方式 1: 使用 as.sh 脚本启动
./as.sh
# 方式 2: 指定进程 ID 启动
./as.sh <pid>2.4 在 Docker 容器中使用
如果需要诊断运行在 Docker 容器中的 Java 应用:
bash
# 进入容器
docker exec -it <container_id> /bin/bash
# 在容器内安装并启动 Arthas
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar注意
确保容器内已安装 curl 或 wget 工具,如果没有可以使用
yum install curl或apt-get install curl安装。
3 基本使用
3.1 启动和连接
连接到 Java 进程后,会看到 Arthas 的命令提示符:
bash
[arthas@12345]$3.2 常用命令
3.2.1 dashboard - 仪表板
显示当前进程的实时数据面板:
bash
dashboard显示内容包括:
- 线程信息(运行中的线程数、阻塞线程数等)
- 内存使用情况
- GC 情况
- Runtime 信息
按 q 或 Ctrl+C 退出。
3.2.2 thread - 查看线程信息
bash
# 查看所有线程
thread
# 查看指定线程的堆栈
thread <线程ID>
# 查看最繁忙的 3 个线程
thread -n 3
# 查看处于 BLOCKED 状态的线程
thread -b3.2.3 jad - 反编译
反编译指定的类:
bash
# 反编译类
jad com.example.MyClass
# 反编译指定方法
jad com.example.MyClass myMethod
# 反编译并指定 ClassLoader
jad -c <classloader-hash> com.example.MyClass3.2.4 watch - 监控方法
监控方法的入参、返回值和异常:
bash
# 监控方法的入参和返回值
watch com.example.MyClass myMethod "{params,returnObj}" -x 2
# 监控方法执行时间超过 100ms 的调用
watch com.example.MyClass myMethod "{params,returnObj}" '#cost>100' -x 2
# 监控方法抛出异常的情况
watch com.example.MyClass myMethod "{params,throwExp}" -e -x 2参数说明:
-x: 指定输出结果的展开层数,默认为 1-e: 表示只统计抛出异常的调用-b: 在方法调用前观察-s: 在方法返回后观察
3.2.5 trace - 方法调用路径追踪
追踪方法内部调用路径,并输出每个方法的耗时:
bash
# 追踪方法调用
trace com.example.MyClass myMethod
# 追踪调用耗时超过 100ms 的调用
trace com.example.MyClass myMethod '#cost > 100'
# 追踪多层调用
trace -E com.example.MyClass method1|method23.2.6 monitor - 方法执行监控
监控方法执行的统计数据:
bash
# 每 5 秒统计一次方法调用情况
monitor -c 5 com.example.MyClass myMethod显示内容包括:
- 调用次数
- 成功次数
- 失败次数
- 平均耗时
- 失败率
3.2.7 sc - 查看类信息
查看 JVM 中加载的类信息:
bash
# 搜索类
sc com.example.*
# 查看类的详细信息
sc -d com.example.MyClass
# 查看类的字段信息
sc -d -f com.example.MyClass3.2.8 sm - 查看方法信息
查看类的方法信息:
bash
# 查看类的所有方法
sm com.example.MyClass
# 查看指定方法
sm com.example.MyClass myMethod
# 查看方法的详细信息
sm -d com.example.MyClass myMethod3.3 高级功能
3.3.1 profiler - 性能分析
生成火焰图分析性能瓶颈:
bash
# 开始采样
profiler start
# 查看采样状态
profiler getSamples
# 停止采样并生成火焰图
profiler stop --format html
# 生成的文件路径会在命令输出中显示3.3.2 logger - 动态修改日志级别
bash
# 查看所有 logger 信息
logger
# 查看指定 logger 的信息
logger -n com.example
# 修改日志级别
logger --name com.example --level debug3.3.3 redefine - 热更新代码
bash
# 加载外部的 .class 文件,热更新代码
redefine /path/to/MyClass.class注意
热更新有一定限制,不能修改类的结构(如添加字段、方法等),只能修改方法体内的代码。
3.4 退出 Arthas
bash
# 退出当前会话,但 Arthas 服务端继续运行
quit
# 或者使用
exit
# 完全关闭 Arthas 服务端
stop4 实战场景
4.1 排查类加载问题
当遇到 ClassNotFoundException 或 NoClassDefFoundError 时:
bash
# 查找类是否被加载
sc com.example.MyClass
# 查看类的详细信息,包括 ClassLoader
sc -d com.example.MyClass
# 如果有多个同名类,使用 ClassLoader hash 区分
sc -d -c <classloader-hash> com.example.MyClass4.2 排查方法执行慢的问题
bash
# 使用 trace 追踪方法调用链路和耗时
trace com.example.Service slowMethod
# 或者使用 monitor 监控方法执行统计
monitor -c 5 com.example.Service slowMethod
# 生成火焰图分析性能瓶颈
profiler start
# 等待一段时间后停止
profiler stop --format html4.3 查看方法的入参和返回值
bash
# 查看方法的入参和返回值
watch com.example.Service processData "{params,returnObj}" -x 3
# 查看特定条件下的调用(如某个参数值)
watch com.example.Service processData "{params,returnObj}" "params[0]=='特定值'" -x 34.4 排查线程死锁
bash
# 查看线程状态
thread
# 查看阻塞的线程
thread -b
# 查看指定线程的堆栈信息
thread <线程ID>4.5 内存泄漏排查
bash
# 查看内存使用情况
dashboard
# 查看堆内存使用
memory
# 生成堆转储文件
heapdump /tmp/heap.hprof5 远程访问配置
5.1 启用远程访问
默认情况下,Arthas 只允许本地访问。如需远程访问,需要在启动时指定参数:
bash
# 启动时指定监听地址和端口
java -jar arthas-boot.jar --telnet-port 3658 --http-port 85635.2 通过 Web Console 访问
启动后,可以通过浏览器访问 Arthas:
http://<服务器IP>:85635.3 开放防火墙端口
bash
# 开放 Arthas Telnet 端口
firewall-cmd --zone=public --add-port=3658/tcp --permanent
# 开放 Arthas HTTP 端口
firewall-cmd --zone=public --add-port=8563/tcp --permanent
# 重载防火墙规则
firewall-cmd --reload安全提示
远程访问可能存在安全风险,生产环境请谨慎开启,建议仅在内网环境使用,并配合防火墙规则限制访问来源。
6 常见问题
6.1 Arthas 无法连接到 Java 进程
可能原因:
- Java 进程没有运行
- 权限不足,需要使用与 Java 进程相同的用户启动 Arthas
- 目标进程的 JDK 版本过低
解决方法:
bash
# 使用相同用户启动 Arthas
sudo -u <java进程用户> java -jar arthas-boot.jar
# 或直接指定进程 PID
sudo -u <java进程用户> java -jar arthas-boot.jar <pid>6.2 命令执行没有输出
某些命令(如 watch、trace)需要触发目标方法才会有输出,请确保:
- 方法确实被调用了
- 条件表达式正确
- ClassLoader 正确
6.3 热更新失败
限制说明:
- 不能修改类的结构(添加/删除字段、方法)
- 不能修改方法签名
- 不能修改父类
- 只能修改方法体内的代码逻辑
6.4 性能影响
Arthas 的诊断功能会对应用性能产生一定影响,特别是:
watch、trace等命令会降低方法执行速度profiler会消耗一定的 CPU 资源
建议:
- 诊断完成后及时关闭相关命令
- 生产环境使用时添加条件过滤,减少影响范围
7 最佳实践
7.1 使用建议
- 诊断前备份: 使用
redefine等命令前,建议先备份原始类文件 - 及时关闭: 诊断完成后,及时使用
stop命令关闭 Arthas - 添加过滤条件: 使用
watch、trace等命令时,尽量添加过滤条件减少性能影响 - 限制输出深度: 使用
-x参数控制输出深度,避免输出过多内容
7.2 生产环境使用注意事项
- 权限控制: 限制 Arthas 的使用权限,避免误操作
- 日志记录: 记录所有 Arthas 操作日志,便于追溯
- 影响评估: 使用前评估对应用性能的影响
- 应急预案: 准备好应急回滚方案
7.3 常用命令组合
问题排查流程:
bash
# 1. 查看整体状态
dashboard
# 2. 查看线程情况
thread -n 10
# 3. 定位慢方法
trace com.example.Service slowMethod
# 4. 查看方法详情
watch com.example.Service slowMethod "{params,returnObj,#cost}" -x 2
# 5. 生成火焰图
profiler start
# 等待采样...
profiler stop --format html8 参考资源
9 附录
9.1 完整命令列表
| 命令 | 说明 |
|---|---|
| dashboard | 实时数据面板 |
| thread | 查看线程信息 |
| jad | 反编译 |
| watch | 监控方法 |
| trace | 方法调用路径追踪 |
| monitor | 方法执行监控 |
| stack | 方法被调用的调用路径 |
| tt | 时间隧道,记录方法调用 |
| sc | 查看类信息 |
| sm | 查看方法信息 |
| jvm | 查看 JVM 信息 |
| memory | 查看内存信息 |
| sysprop | 查看系统属性 |
| sysenv | 查看系统环境变量 |
| vmoption | 查看和修改 JVM 诊断选项 |
| logger | 查看和修改日志配置 |
| heapdump | 生成堆转储文件 |
| profiler | 生成火焰图 |
| redefine | 热更新代码 |
| classloader | 查看 ClassLoader 信息 |
| dump | dump 已加载的类字节码 |
| mc | 内存编译器 |
| ognl | 执行 OGNL 表达式 |
| mbean | 查看 MBean 信息 |
| grep | 过滤命令输出 |
| pwd | 查看当前工作目录 |
| cat | 查看文件内容 |
| cls | 清空屏幕 |
| session | 查看会话信息 |
| reset | 重置增强类 |
| version | 查看 Arthas 版本 |
| history | 查看命令历史 |
| quit/exit | 退出 Arthas |
| stop | 关闭 Arthas 服务 |
9.2 常用 OGNL 表达式
bash
# 获取静态字段值
ognl '@com.example.MyClass@staticField'
# 调用静态方法
ognl '@com.example.MyClass@staticMethod()'
# 获取 Spring Context
ognl '#context=@com.example.SpringContextHolder@getApplicationContext()'
# 获取 Spring Bean
ognl '#context=@com.example.SpringContextHolder@getApplicationContext(), #context.getBean("beanName")'