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 API(jdk.attach 模块)附加到目标进程。
  2. Agent 注入:
    • Arthas 以 Java Agent 方式注入字节码(arhats-agent.jar)。
  3. 采样原理:
    • 用 ThreadMXBean 获取线程 CPU 时间。
Logo

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

更多推荐