Arthas 工具:Java 开发者的线上诊断神器
想象一下,你的 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,适用范围广泛。
安装使用
- 下载 Arthas:
# 直接在终端执行以下命令
curl -O https://arthas.aliyun.com/arthas-boot.jar
- 启动 Arthas:
# 运行命令并选择要诊断的 Java 进程
java -jar arthas-boot.jar
- 验证安装:
输入 dashboard 并回车,能看到实时 JVM 监控面板,说明安装成功
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 行为(如超时时间、输出格式) |
使用小贴士
- 自动补全:输入命令时按
Tab
键可补全命令或参数。 - 过滤输出:使用管道符
| grep
过滤结果(如thread | grep "http-nio"
)。 - 批量操作:支持同时监控多个类或方法(如
watch *UserService * '{params}'
)。 - 安全退出:避免直接关闭终端,建议先输入
quit
退出连接。
快速上手建议:
- 从只读命令开始(如
sc
,dashboard
,thread
),熟悉后再尝试watch
或trace
。 - 官方文档:Arthas 命令列表
常见问题解答(FAQ)
Q1:Arthas 连接失败怎么办?
- 确保目标 Java 进程正在运行。
- 检查是否权限不足(如 Linux 下尝试
sudo
执行)。
Q2:输入命令后无输出?
- 确认命令语法正确(如
watch
的表达式格式)。 - 使用
-v
参数查看详细日志(如watch -v ...
)。
Q3:如何彻底卸载 Arthas?
- 直接删除
arthas-boot.jar
文件即可,Arthas 不会修改应用代码。
评论