Arthas(阿尔萨斯)
一、Arthas 是什么?
Arthas(阿尔萨斯)是阿里巴巴开源的一款 Java 在线诊断工具,基于 Java Agent 和字节码增强技术实现。它无需重启 JVM,即可动态追踪代码执行、实时查看 JVM 状态、修改代码逻辑,是生产环境问题排查的“瑞士军刀”。
核心特点:
-
无侵入:无需修改代码或重启应用。
-
动态追踪:实时监控方法调用、参数、返回值。
-
热修复:直接修改运行时代码(慎用)。
全平台支持:支持 Linux/Windows/macOS,兼容 JDK 6+。
二、 Arthas(阿尔萨斯)能为你做什么?
Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到 JVM 的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
- 怎样直接从 JVM 内查找某个类的实例?
Arthas 支持 JDK 6+(4.x 版本不再支持 JDK 6 和 JDK 7),支持 Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
三、安装与启动
- 快速安装
# 下载最新版本
curl -O https://arthas.aliyun.com/arthas-boot.jar
- 启动并附加到目标 JVM
java -jar arthas-boot.jar
启动后,Arthas 会列出所有 Java 进程,输入序号选择要诊断的进程。
- 退出 Arthas
- 输入 stop:关闭当前连接。
- 输入 quit:退出客户端(不关闭 Arthas 服务端)。
四、核心命令详解
- 基础命令
命令 | 作用 |
---|---|
help | 查看所有命令帮助 |
dashboard | 实时监控 JVM 状态(CPU、内存、线程) |
version | 显示 Arthas 版本 |
history | 查看命令历史记录 |
示例:
# 实时监控 JVM 仪表盘(类似 top)
dashboard
- 类/方法诊断
命令 | 作用 |
---|---|
sc (Search Class) | 查找已加载的类信息 |
sm (Search Method) | 查看类的方法详情 |
jad | 反编译指定类的字节码 |
redefine | 热替换类(需提前编译好.class 文件) |
示例:
# 反编译 com.example.MyService 类
jad com.example.MyService# 热替换类(替换后立即生效)
redefine /path/to/MyService.class
- 方法调用追踪
命令 | 作用 |
---|---|
watch | 观察方法入参、返回值、异常 |
trace | 追踪方法内部调用链路及耗时 |
stack | 查看方法被调用的调用栈 |
monitor | 统计方法调用次数、成功率、平均耗时 |
示例:
# 监控方法入参和返回值(-n 表示监控次数,-x 表示展开层级)
watch com.example.MyService doSomething "{params, returnObj}" -n 5 -x 3# 追踪方法内部调用链路及耗时(耗时单位 ms)
trace com.example.MyService processOrder -n 3
- 线程/堆内存分析
命令 | 作用 |
---|---|
thread | 查看线程状态、CPU 占用、阻塞点 |
heapdump | 生成堆转储文件(类似 jmap -dump) |
vmtool | 直接操作 JVM 对象(查询/修改字段值) |
示例:
# 查找 CPU 占用最高的线程
thread -n 3# 生成堆转储文件到指定路径
heapdump --live /tmp/heap.hprof
- 高级功能
命令 | 作用 |
---|---|
ognl | 执行任意 OGNL 表达式(调用静态方法等) |
profiler | 生成火焰图(需配合 async-profiler) |
logger | 动态修改日志级别(如临时开启 DEBUG 日志) |
示例:
# 调用静态方法获取系统属性
ognl '@java.lang.System@getProperty("user.dir")'# 动态调整日志级别为 DEBUG
logger --name ROOT --level debug
五、实战案例
案例 1:定位接口超时问题
# 1. 追踪方法调用链路及耗时
trace com.example.OrderController createOrder# 2. 观察某个方法的参数和返回值
watch com.example.UserService getUserById "{params, returnObj}" -x 3# 3. 发现某个 SQL 查询慢,临时打印执行的 SQL 日志
logger --name org.hibernate.SQL --level DEBUG
案例 2:紧急修复空指针异常
# 1. 反编译问题类
jad --source-only com.example.BugService > BugService.java# 2. 本地编辑代码,添加空指针判断,重新编译
javac BugService.java# 3. 热替换类(立即生效)
redefine /path/to/BugService.class
六、Arthas IDEA插件
Arthas的命令太多了,推荐一款插件
在 IDEA 的插件市场搜索 arthas idea,点击 Install, 重启 IDEA 生效
- 优点
1. 生成Arthas命令:IDEA插件可以自动生成Arthas命令,方便用户使用。虽然一些基础命令如thread、jvm、dashboard等建议用户手动输入以加快操作速度
2. 性能分析:使用trace命令选择项目中的方法进行链路跟踪,粘贴到控制台监听调用接口,观察结果以定位问题方法或数据库查询
- 基础使用教程
生成 Arthas 命令
操作步骤:
在代码编辑器中,右键点击 类名 或 方法名。选择 Arthas Command → 选择需要的命令(如 watch、trace)。自动生成命令并复制到剪贴板,粘贴到 Arthas 控制台执行。
示例:生成 trace 命令
右键点击目标方法(如 UserService.getUserById())。选择 Arthas Command → trace method。生成命令:trace com.example.UserService getUserById -n 5 -v。粘贴到 Arthas 控制台,观察方法内部调用链路及耗时。
七、Arthas 优缺点
-
优点
零成本接入:无需重启应用,生产环境友好。功能全面:覆盖诊断、监控、热修复全场景。
动态性:实时修改代码逻辑或日志级别。
社区活跃:阿里巴巴持续维护,文档丰富。
-
缺点
学习曲线:需熟悉大量命令和参数。安全风险:热替换可能引发不稳定(需严格测试)。
性能开销:高频追踪方法可能增加 CPU 负载。
八、最佳实践
-
生产环境慎用写操作:优先使用 watch/trace 等只读命令。
-
限制监控范围:避免全量监控(使用 -n 限制监控次数)。
-
结合日志分析:先用 Arthas 定位问题范围,再通过日志深挖。
-
火焰图分析:对性能问题使用 profiler 生成火焰图。
-
权限管控:禁止非授权人员访问生产环境 Arthas。
九、与其他工具对比
工具 | 优势 | 局限性 |
---|---|---|
jstack | 轻量级线程快照 | 只能手动触发,无持续监控 |
JProfiler | 可视化性能分析 | 需安装客户端,付费 |
Arthas | 动态追踪、热修复、无需重启 | 命令行操作,学习成本较高 |
十、总结
Arthas 是 Java 开发者诊断线上问题的终极工具,尤其擅长:
-
实时方法级追踪:无需加日志即可观察代码执行细节。
-
动态热修复:紧急修复线上问题(最后手段)。
-
低开销监控:替代部分 jmap/jstack 功能。
学习资源:
-
官方文档:https://arthas.aliyun.com/doc/
-
GitHub 仓库:https://github.com/alibaba/arthas