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.6java com.xxx.Main无需-cp .(无模块系统)
JDK 21java -cp . com.xxx.Main必须加 -cp .(避免模块化干扰)

📌 常用命令(实战精选)

命令作用
thread -n 1 -i 500查看 CPU 最高线程(500ms 采样,时间可选)
jad com.my.test.multiThread.ArthasTest反编译类(查看源码)
thread 1直接查看主线程(ID=1)
dashboard(按q退出)实时监控(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/Othread -n 5+jstack
方法耗时优化慢方法trace com.xxx.Method
类加载问题类冲突、重复加载sc -d java.util.ArrayList
线上调试不重启查变量ognl '@Main@counter'

6. Arthas 监控机制原理

  1. Attach 机制
    • 通过 JVM 的Attach APIjdk.attach模块)附加到目标进程。
  2. Agent 注入
    • Arthas 以 Java Agent 方式注入字节码(arhats-agent.jar)。
  3. 采样原理
    • ThreadMXBean获取线程 CPU 时间。