Arthas 详解:Java 应用诊断利器
Arthas 是阿里巴巴开源的一款 Java 应用诊断工具,无需修改代码、无需重启应用,就能在线排查生产环境的各种问题(如性能瓶颈、内存泄漏、线程阻塞、异常排查等),被称为"Java 程序员的瑞士军刀"。
一、核心定位与适用场景
核心价值
-
无侵入:无需修改应用代码、无需重启, attach 到运行中的 JVM 即可使用
-
多维度诊断:覆盖 线程、内存、CPU、类加载、方法调用、异常 等全链路问题
-
易用性:提供命令行交互(类似 Linux 命令)、Web UI,支持脚本化自动化诊断
典型使用场景
-
接口响应慢,定位哪个方法耗时过长
-
应用 CPU 使用率飙升,找到占用 CPU 最高的线程/代码
-
内存泄漏,分析对象创建/销毁情况、大对象分布
-
类加载冲突(NoClassDefFoundError/ClassCastException)
-
线上异常无法复现,实时查看方法入参、返回值、异常堆栈
-
动态修改日志级别(无需重启应用)
-
验证 JVM 参数是否生效
二、安装与启动(快速上手)
Arthas 支持 Linux/Mac/Windows,依赖 JDK 8+(兼容 OpenJDK、Oracle JDK),安装和启动极简:
1. 安装(一键下载)
Bash
# Linux/Mac 一键下载(推荐)
curl -O https://arthas.aliyun.com/arthas-boot.jar
# Windows(需先安装 curl 或直接浏览器下载)
curl -O https://arthas.aliyun.com/arthas-boot.jar
2. 启动(attach 到 Java 进程)
Bash
# 运行 arthas-boot.jar,自动列出当前机器的 Java 进程
java -jar arthas-boot.jar
# 输入进程编号(如 1),回车即可 attach 成功
3. 可选:Web UI 访问
启动后会自动暴露 Web 端口(默认 8563),浏览器访问 http://localhost:8563,即可通过可视化界面操作(命令行和 Web UI 功能完全一致)。
三、核心命令(常用+高频)
Arthas 命令风格接近 Linux,支持Tab补全、历史命令(上下键),以下是最常用的核心命令:
1. 进程/系统信息查询
| 命令 | 功能描述 | 示例 |
|---|---|---|
dashboard |
实时仪表盘:CPU、内存、线程、GC 状态(按 q 退出) | 直接输入 dashboard,每 2 秒刷新一次 |
sysinfo |
查看系统/Java 环境信息(JDK 版本、CPU 核数等) | sysinfo |
jvm |
查看 JVM 详细信息(堆内存、元空间、GC 算法等) | jvm |
2. 线程问题排查
| 命令 | 功能描述 | 示例 |
|---|---|---|
thread |
查看线程状态(就绪/阻塞/等待),默认显示所有线程 | thread(查看所有)、thread -n 3(Top 3 忙线程) |
thread ID |
查看指定线程的堆栈信息(定位阻塞原因) | thread 123(查看 ID 为 123 的线程) |
thread -b |
自动检测死锁(找到死锁线程和锁资源) | thread -b |
3. 方法性能与调用追踪
| 命令 | 功能描述 | 示例 |
|---|---|---|
trace |
追踪方法调用链路,统计每个子方法耗时 | trace com.xxx.Service queryUser --duration 500(追踪耗时>500ms的调用) |
profiler |
生成 CPU/内存火焰图(可视化性能瓶颈) | profiler start(启动)、profiler stop(停止,自动生成火焰图链接) |
monitor |
监控方法调用统计(QPS、成功率、平均耗时) | monitor com.xxx.Service queryUser -c 5(每5秒输出一次统计) |
watch |
观察方法入参、返回值、异常(无侵入调试) | watch com.xxx.Service queryUser "{params,returnObj,throwExp}" -x 2(显示参数/返回值/异常,深度2) |
4. 内存/类加载问题
| 命令 | 功能描述 | 示例 |
|---|---|---|
heapdump |
导出堆内存快照(.hprof 文件,可用 MAT 分析) | heapdump /tmp/heap.hprof(指定导出路径) |
jmap |
查看堆内存对象分布(类似 JDK 自带 jmap) | jmap -histo(按实例数排序)、jmap -histo:live(只统计存活对象) |
classloader |
查看类加载器层级、已加载类数量 | classloader(查看所有类加载器)、classloader -l(列出已加载类) |
sc |
搜索已加载的类(支持模糊匹配) | sc -d com.xxx.User(查看 User 类的详细信息) |
jad |
反编译已加载的类(验证线上代码是否正确) | jad com.xxx.Service(反编译 Service 类) |
5. 日志/配置动态修改
| 命令 | 功能描述 | 示例 |
|---|---|---|
logger |
查看/修改日志级别(无需重启应用) | logger list(查看所有 Logger)、logger set root info(设置 root 日志为 info 级别) |
vmoption |
查看/修改 JVM 参数(如 GC 日志、堆大小等) | vmoption(查看所有参数)、vmoption PrintGCDetails true(开启 GC 详细日志) |
四、进阶用法:脚本化与自动化
Arthas 支持通过 OGNL 表达式 和 脚本文件 实现自动化诊断,例如:
- 编写脚本文件
diagnose.ash:
Bash
# 监控目标方法 10 秒,输出统计结果
monitor com.xxx.Service queryUser -c 10
# 追踪耗时>100ms的调用链路
trace com.xxx.Service queryUser --duration 100
# 导出堆快照
heapdump /tmp/auto-heap.hprof
- 执行脚本:
Bash
java -jar arthas-boot.jar -f diagnose.ash 123(123 是目标进程 ID)
五、注意事项(生产环境使用)
-
低侵入性:Arthas 本身性能开销极低(CPU 占用通常<1%),但高频调用
trace/watch等命令可能影响性能,建议:-
限制追踪时长(如
trace -d 60只追踪 60 秒) -
过滤耗时阈值(如
--duration 500只追踪慢调用)
-
-
权限:需要和目标 Java 进程相同的用户权限(否则无法 attach)
-
端口占用:默认占用 8563(Web UI)、3658(命令行通信),如需多实例,可通过
-p指定端口:Bash -
卸载:attach 后执行
stop命令即可完全卸载,不会残留进程
六、学习资源
-
官方文档(最权威):https://arthas.aliyun.com/doc/
-
火焰图分析:生成的火焰图可通过浏览器直接打开,横轴是调用耗时,纵轴是调用链路,颜色越深表示耗时越长
Arthas 几乎覆盖了 Java 应用线上诊断的所有场景,且上手成本低,是 Java 开发/运维人员必备的工具之一。建议本地先通过简单 Java 程序练习核心命令,再应用到生产环境。