Skip to content

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 官方资源

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.jar

2.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 curlapt-get install curl 安装。

3 基本使用

3.1 启动和连接

连接到 Java 进程后,会看到 Arthas 的命令提示符:

bash
[arthas@12345]$

3.2 常用命令

3.2.1 dashboard - 仪表板

显示当前进程的实时数据面板:

bash
dashboard

显示内容包括:

  • 线程信息(运行中的线程数、阻塞线程数等)
  • 内存使用情况
  • GC 情况
  • Runtime 信息

qCtrl+C 退出。

3.2.2 thread - 查看线程信息

bash
# 查看所有线程
thread

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

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

# 查看处于 BLOCKED 状态的线程
thread -b

3.2.3 jad - 反编译

反编译指定的类:

bash
# 反编译类
jad com.example.MyClass

# 反编译指定方法
jad com.example.MyClass myMethod

# 反编译并指定 ClassLoader
jad -c <classloader-hash> com.example.MyClass

3.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|method2

3.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.MyClass

3.2.8 sm - 查看方法信息

查看类的方法信息:

bash
# 查看类的所有方法
sm com.example.MyClass

# 查看指定方法
sm com.example.MyClass myMethod

# 查看方法的详细信息
sm -d com.example.MyClass myMethod

3.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 debug

3.3.3 redefine - 热更新代码

bash
# 加载外部的 .class 文件,热更新代码
redefine /path/to/MyClass.class

注意

热更新有一定限制,不能修改类的结构(如添加字段、方法等),只能修改方法体内的代码。

3.4 退出 Arthas

bash
# 退出当前会话,但 Arthas 服务端继续运行
quit

# 或者使用
exit

# 完全关闭 Arthas 服务端
stop

4 实战场景

4.1 排查类加载问题

当遇到 ClassNotFoundExceptionNoClassDefFoundError 时:

bash
# 查找类是否被加载
sc com.example.MyClass

# 查看类的详细信息,包括 ClassLoader
sc -d com.example.MyClass

# 如果有多个同名类,使用 ClassLoader hash 区分
sc -d -c <classloader-hash> com.example.MyClass

4.2 排查方法执行慢的问题

bash
# 使用 trace 追踪方法调用链路和耗时
trace com.example.Service slowMethod

# 或者使用 monitor 监控方法执行统计
monitor -c 5 com.example.Service slowMethod

# 生成火焰图分析性能瓶颈
profiler start
# 等待一段时间后停止
profiler stop --format html

4.3 查看方法的入参和返回值

bash
# 查看方法的入参和返回值
watch com.example.Service processData "{params,returnObj}" -x 3

# 查看特定条件下的调用(如某个参数值)
watch com.example.Service processData "{params,returnObj}" "params[0]=='特定值'" -x 3

4.4 排查线程死锁

bash
# 查看线程状态
thread

# 查看阻塞的线程
thread -b

# 查看指定线程的堆栈信息
thread <线程ID>

4.5 内存泄漏排查

bash
# 查看内存使用情况
dashboard

# 查看堆内存使用
memory

# 生成堆转储文件
heapdump /tmp/heap.hprof

5 远程访问配置

5.1 启用远程访问

默认情况下,Arthas 只允许本地访问。如需远程访问,需要在启动时指定参数:

bash
# 启动时指定监听地址和端口
java -jar arthas-boot.jar --telnet-port 3658 --http-port 8563

5.2 通过 Web Console 访问

启动后,可以通过浏览器访问 Arthas:

http://<服务器IP>:8563

5.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 进程

可能原因:

  1. Java 进程没有运行
  2. 权限不足,需要使用与 Java 进程相同的用户启动 Arthas
  3. 目标进程的 JDK 版本过低

解决方法:

bash
# 使用相同用户启动 Arthas
sudo -u <java进程用> java -jar arthas-boot.jar

# 或直接指定进程 PID
sudo -u <java进程用> java -jar arthas-boot.jar <pid>

6.2 命令执行没有输出

某些命令(如 watchtrace)需要触发目标方法才会有输出,请确保:

  1. 方法确实被调用了
  2. 条件表达式正确
  3. ClassLoader 正确

6.3 热更新失败

限制说明:

  • 不能修改类的结构(添加/删除字段、方法)
  • 不能修改方法签名
  • 不能修改父类
  • 只能修改方法体内的代码逻辑

6.4 性能影响

Arthas 的诊断功能会对应用性能产生一定影响,特别是:

  • watchtrace 等命令会降低方法执行速度
  • profiler 会消耗一定的 CPU 资源

建议:

  • 诊断完成后及时关闭相关命令
  • 生产环境使用时添加条件过滤,减少影响范围

7 最佳实践

7.1 使用建议

  1. 诊断前备份: 使用 redefine 等命令前,建议先备份原始类文件
  2. 及时关闭: 诊断完成后,及时使用 stop 命令关闭 Arthas
  3. 添加过滤条件: 使用 watchtrace 等命令时,尽量添加过滤条件减少性能影响
  4. 限制输出深度: 使用 -x 参数控制输出深度,避免输出过多内容

7.2 生产环境使用注意事项

  1. 权限控制: 限制 Arthas 的使用权限,避免误操作
  2. 日志记录: 记录所有 Arthas 操作日志,便于追溯
  3. 影响评估: 使用前评估对应用性能的影响
  4. 应急预案: 准备好应急回滚方案

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 html

8 参考资源

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 信息
dumpdump 已加载的类字节码
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")'