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(按 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/O thread -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 时间。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐