Arthas是阿里巴巴开源的Java 诊断工具用于实时监控线上应用无需重启快速定位 CPU、内存、线程问题分析方法执行耗时、参数、返回值支持 JDK 6包括 JDK 21✅核心优势通过 JVM Attach 机制动态注入 Agent不修改代码、不重启应用。2. Arthas 的使用下载安装 启动 命令 下载# 从 GitHub 获取最新版推荐 4.1.5wget 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 无法 attachjava 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直接查看主线程ID1dashboard按q退出实时监控CPU/内存/线程ognl com.my.test.multiThread.ArthasTestcounter查看静态变量无 I/O为什么thread -n 1常显示 Arthas 自身线程因为 Arthas 本身在采样用-i 500增加采样时间即可解决见下文。3. 举例说明 单线程 CPU 压测✅ 步骤1. 修改代码移除System.out.printlnwhile (true) { counter; // 仅保留纯计算 }2. 启动# 进入 classpath 根目录 cd D:\my-project\jdk-21-test-workspace\out\production\jdk-21-test # 用 -cp . 启动 java -cp . com.my.test.multiThread.ArthasTest3. Arthas 诊断定位到 arthas-boot.jar 的目录下java -jar arthas-boot.jar # 选择进程 ID如 49827 thread -n 1 -i 500 # 正确输出main Id1 cpuUsage99.2% ... RUNNABLE at com.my.test.multiThread.ArthasTest.single(ArthasTest.java:21) 多线程示例扩展1. 创建多线程类MultiThreadTest.javapackage 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 Id12 cpuUsage20.3% ... RUNNABLE at com.my.test.multiThread.MultiThreadTest.lambda$main$0(MultiThreadTest.java:8) Thread-1 Id13 cpuUsage20.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.Main7.查看变量无 I/O 查看ognl Maincounter✅核心口诀-cp .启动 -i 500采样 看到真实业务代码5. Arthas 使用场景场景举例Arthas 命令CPU 高负载死循环、计算密集型thread -n 1 -i 500线程阻塞死锁、等待 I/Othread -n 5jstack方法耗时优化慢方法trace com.xxx.Method类加载问题类冲突、重复加载sc -d java.util.ArrayList线上调试不重启查变量ognl Maincounter6. Arthas 监控机制原理Attach 机制通过 JVM 的Attach APIjdk.attach模块附加到目标进程。Agent 注入Arthas 以 Java Agent 方式注入字节码arhats-agent.jar。采样原理用ThreadMXBean获取线程 CPU 时间。