Arthas 介绍
Arthas是阿里巴巴开源的Java 诊断工具,用于:
- 实时监控线上应用(无需重启)
- 快速定位 CPU、内存、线程问题
- 分析方法执行耗时、参数、返回值
- 支持 JDK 6+(包括 JDK 21)
✅核心优势:
通过 JVM Attach 机制动态注入 Agent,不修改代码、不重启应用。
2. Arthas 的使用(下载安装 + 启动 + 命令)
📥 下载
# 从 GitHub 获取最新版(推荐 4.1.5+)wget https://repo1.maven.org/maven2/com/taobao/arthas/arthas-boot/4.1.5/arthas-boot-4.1.5.jar
🔌 启动方式(关键!JDK 21 必须用-cp .)
✅ 正确启动方式(JDK 21 通用):
# 1. 编译代码(确保有 .class) cd D:\my-project\jdk-21-test-workspace\src javac -d ..\out\production\jdk-21-test com\my\test\multiThread\ArthasTest.java # 2. 用 -cp . 启动应用(绕过模块化问题!) cd D:\my-project\jdk-21-test-workspace\out\production\jdk-21-test java -cp . com.my.test.multiThread.ArthasTest
❌ 错误启动方式(JDK 21 会导致 Arthas 无法 attach):
java com.my.test.multiThread.ArthasTest # 无 -cp . !
🌐 JDK 1.6 vs JDK 21 启动差异
| JDK 版本 | 启动命令 | 说明 |
|---|---|---|
| JDK 1.6 | java com.xxx.Main | 无需-cp .(无模块系统) |
| JDK 21 | java -cp . com.xxx.Main | 必须加 -cp .(避免模块化干扰) |
📌 常用命令(实战精选)
| 命令 | 作用 |
|---|---|
thread -n 1 -i 500 | 查看 CPU 最高线程(500ms 采样,时间可选) |
jad com.my.test.multiThread.ArthasTest | 反编译类(查看源码) |
thread 1 | 直接查看主线程(ID=1) |
dashboard(按 | 实时监控(CPU/内存/线程) |
ognl '@com.my.test.multiThread.ArthasTest@counter' | 查看静态变量(无 I/O) |
💡为什么
thread -n 1常显示 Arthas 自身线程?
因为 Arthas 本身在采样,用-i 500增加采样时间即可解决(见下文)。
3. 举例说明
🔥 单线程 CPU 压测
✅ 步骤:
1. 修改代码(移除System.out.println):
while (true) { counter++; // 仅保留纯计算 }2. 启动# 进入 classpath 根目录 cd D:\my-project\jdk-21-test-workspace\out\production\jdk-21-test # 用 -cp . 启动 java -cp . com.my.test.multiThread.ArthasTest
3. Arthas 诊断:
定位到 arthas-boot.jar 的目录下
java -jar arthas-boot.jar # 选择进程 ID(如 49827) thread -n 1 -i 500 # 正确!
输出:
"main" Id=1 cpuUsage=99.2% ... RUNNABLE at com.my.test.multiThread.ArthasTest.single(ArthasTest.java:21)
🌐 多线程示例(扩展)
1. 创建多线程类MultiThreadTest.java:
package com.my.test.multiThread; public class MultiThreadTest { public static void main(String[] args) { for (int i = 0; i < 5; i++) { new Thread(() -> { while (true) { System.out.println("Thread " + Thread.currentThread().getId()); } }).start(); } } }2. 启动 & 诊断:
cd D:\my-project\jdk-21-test-workspace\out\production\jdk-21-test java -cp . com.my.test.multiThread.MultiThreadTest # 必须 -cp . # Arthas 诊断 thread -n 5 -i 500
输出:
"Thread-0" Id=12 cpuUsage=20.3% ... RUNNABLE at com.my.test.multiThread.MultiThreadTest.lambda$main$0(MultiThreadTest.java:8) "Thread-1" Id=13 cpuUsage=20.1% ... RUNNABLE at com.my.test.multiThread.MultiThreadTest.lambda$main$0(MultiThreadTest.java:8)
4. 使用命令总结(按顺序)
| 步骤 | 操作 | 关键命令 | 说明 |
|---|---|---|---|
| 1.准备代码 | 移除System.out.println(避免 I/O 干扰) | counter++; | 测试使用,可忽略 |
| 2.编译 | 生成 .class 文件 | javac -d out/production/... src/... | 测试使用,可忽略 |
| 3.启动 | 必须加-cp .(JDK 21 必须) | java -cp . com.xxx.Main | 测试使用,可忽略 |
| 4.启动 Arthas | 选择进程 | java -jar arthas-boot.jar | 实际使用 |
| 5.诊断 CPU | 用长采样时间 | thread -n 1 -i 500 | 实际使用,thread -n 1 可查看占用内存最高的前1个线程 |
| 6.查看源码 | 反编译类 | jad com.xxx.Main | |
| 7.查看变量 | 无 I/O 查看 | ognl '@Main@counter' |
✅核心口诀:
-cp .启动 +-i 500采样 = 看到真实业务代码
5. Arthas 使用场景
| 场景 | 举例 | Arthas 命令 |
|---|---|---|
| CPU 高负载 | 死循环、计算密集型 | thread -n 1 -i 500 |
| 线程阻塞 | 死锁、等待 I/O | thread -n 5+jstack |
| 方法耗时 | 优化慢方法 | trace com.xxx.Method |
| 类加载问题 | 类冲突、重复加载 | sc -d java.util.ArrayList |
| 线上调试 | 不重启查变量 | ognl '@Main@counter' |
6. Arthas 监控机制原理
- Attach 机制:
- 通过 JVM 的
Attach API(jdk.attach模块)附加到目标进程。
- 通过 JVM 的
- Agent 注入:
- Arthas 以 Java Agent 方式注入字节码(
arhats-agent.jar)。
- Arthas 以 Java Agent 方式注入字节码(
- 采样原理:
- 用
ThreadMXBean获取线程 CPU 时间。
- 用
