Arthas 工具:Java 开发者的线上诊断神器

Arthas Logo

想象一下,你的 Java 应用突然在生产环境报错,但你无法像本地开发时一样打断点调试,只能盯着日志干着急。

Arthas 是什么?

Arthas 就像一位随时待命的‘线上医生’,无需重启服务、无需修改代码,就能帮你快速定位问题!

开发痛点

在日常开发中,我们经常会遇到这些问题:

  • 类来源不清:无法快速定位类加载的 jar 包路径,类冲突或缺失异常频发。
  • 代码未生效:修改后的代码未执行,怀疑分支或提交错误,排查耗时。
  • 线上调试受限:无法断点调试,依赖加日志并重新发布,效率低且难复现问题。
  • 用户数据异常:线上特定用户数据处理异常,但无法复现,线下调试束手无策。
  • JVM 监控缺失:无法实时查看 JVM 内存、GC、线程等核心指标,性能问题难溯源。
  • 性能热点难寻:无法快速定位代码热点生成火焰图,优化方向不明确。
  • 对象操作困难:需直接操作 JVM 内的对象或实例,但缺乏工具支持。

产品简介

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

功能亮点

  • 类加载信息查看 :轻松定位类的加载来源,解决类加载相关的异常问题。
  • 方法执行监控 :实时查看方法的出入参、异常信息,监测方法执行耗时,快速定位性能瓶颈。
  • JVM 状态监控 :实时监控 JVM 的 load、内存、gc 等状态信息,及时发现 JVM 性能问题。
  • 线程状态查看 :查看线程的运行状态,分析线程的执行情况,解决线程相关的故障。
  • 热点定位与火焰图生成 :快速定位应用的热点,生成火焰图,为性能优化提供有力支持。
  • JVM 实例查找 :直接从 JVM 内查找某个类的实例,方便对 JVM 内的对象进行操作。

使用优势

  • 无需 JVM 重启 :在不重启 JVM 的情况下,即可对线上应用进行诊断,避免了因重启导致的服务中断。
  • 无需代码更改 :无需修改应用代码,直接通过 Arthas 进行诊断,节省了开发时间。
  • 命令行交互模式 :采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,方便进行问题的定位和诊断。
  • 支持多平台 :支持 JDK 6 +(4.x 版本不再支持 JDK 6 和 JDK 7),支持 Linux/Mac/Windows,适用范围广泛。

安装使用

  1. 下载 Arthas:
# 直接在终端执行以下命令
curl -O https://arthas.aliyun.com/arthas-boot.jar  
  1. 启动 Arthas:
# 运行命令并选择要诊断的 Java 进程
java -jar arthas-boot.jar  

示意图:Arthas 启动后选择 Java 进程的界面

  1. 验证安装:

输入 dashboard 并回车,能看到实时 JVM 监控面板,说明安装成功

dashboard

dashboard 示例

实战案例

异常排查

涉及命令:

  • trace- 方法内部调用路径,并输出方法路径上的每个节点上耗时
  • watch - 方法执行数据观测
  • thread - 查看当前 JVM 的线程堆栈信息

相关案例:

性能优化

涉及命令:

  • trace- 方法内部调用路径,并输出方法路径上的每个节点上耗时

相关案例:

线上调试

涉及命令:

  • redefine:加载外部的.class文件,redefine 到 JVM 里
  • ognl:执行 ognl 表达式

相关案例:

总结

Arthas 作为阿里巴巴开源的 Java 诊断工具,深受开发者喜爱。它解决了开发人员在生产环境中无法调试、问题难以复现等痛点,让线上问题排查变得更加简单高效。使用 Arthas,开发人员可以快速定位问题,及时解决故障,提升应用的稳定性和性能。

现在,打开你的终端,输入 java -jar arthas-boot.jar,尝试用 help 命令查看支持的功能吧!如果想系统学习,推荐阅读 Arthas 官方文档 或参与社区实践案例。

Arthas 常用命令速查表

以下命令适用于 Arthas 3.x/4.x 版本,按功能分类整理,方便快速查阅:

基础命令

命令 用途 示例 常用参数/说明
help 查看命令帮助文档 help watch 显示指定命令的详细用法
dashboard 实时监控 JVM 运行状态(CPU、内存、线程等) dashboard Ctrl+C 退出监控
quit 退出 Arthas quit 或使用 exit

类与对象

命令 用途 示例 常用参数/说明
sc 查看类的加载信息 sc -d com.example.MyClass -d:显示类来源(如 jar 包路径)
sm 查看类的方法详情 sm com.example.UserService login 显示方法的参数和返回值类型
ognl 执行 OGNL 表达式操作对象 ognl '@com.example.UserService@getUserList()' 动态调用静态方法或访问字段

方法监控

命令 用途 示例 常用参数/说明
watch 监控方法执行的入参、返回值、异常 watch com.example.UserService login '{params, returnObj, throwExp}' -n 3 -x 2 -n:监控次数;-x:展开对象层级
trace 追踪方法内部调用路径及耗时 trace com.example.OrderService getOrderDetail -n:监控次数;#cost>100:筛选耗时超过 100ms 的调用
stack 查看方法被调用的堆栈路径 stack com.example.UserService login 定位方法被哪些上游调用触发

线程与性能

命令 用途 示例 常用参数/说明
thread 查看线程堆栈信息 thread(所有线程)
thread 1(ID 为 1 的线程)
-i 1000:间隔 1 秒刷新线程状态
profiler 生成火焰图分析性能热点 profiler start
profiler stop
输出火焰图文件,需配合工具(如 async-profiler)
jvm 查看 JVM 基础信息(内存、GC、系统属性等) jvm 快速了解 JVM 运行环境

调试与修复

命令 用途 示例 常用参数/说明
redefine 热更新类(需提前编译好 .class 文件) redefine /path/to/MyClass.class ⚠️高风险!可能导致类状态不一致,谨慎使用
reset 重置增强过的类(撤销 watch/trace 等操作) reset com.example.UserService 清理监控代码,恢复原始类

日志与输出

命令 用途 示例 常用参数/说明
logger 查看或动态修改日志级别 logger(查看所有日志配置)
logger --name ROOT --level DEBUG
动态调整日志级别,无需重启应用
options 查看或修改 Arthas 全局配置 options(查看配置)
options json-format true(开启 JSON 输出格式)
自定义 Arthas 行为(如超时时间、输出格式)

使用小贴士

  1. 自动补全:输入命令时按 Tab 键可补全命令或参数。
  2. 过滤输出:使用管道符 | grep 过滤结果(如 thread | grep "http-nio")。
  3. 批量操作:支持同时监控多个类或方法(如 watch *UserService * '{params}')。
  4. 安全退出:避免直接关闭终端,建议先输入 quit 退出连接。

快速上手建议

  • 从只读命令开始(如 sc, dashboard, thread),熟悉后再尝试 watchtrace
  • 官方文档:Arthas 命令列表

常见问题解答(FAQ)

Q1:Arthas 连接失败怎么办?

  • 确保目标 Java 进程正在运行。
  • 检查是否权限不足(如 Linux 下尝试 sudo 执行)。

Q2:输入命令后无输出?

  • 确认命令语法正确(如 watch 的表达式格式)。
  • 使用 -v 参数查看详细日志(如 watch -v ...)。

Q3:如何彻底卸载 Arthas?

  • 直接删除 arthas-boot.jar 文件即可,Arthas 不会修改应用代码。