






















Arthas 是阿里巴巴开源的 Java 诊断工具,用于:
✅ 核心优势:
通过 JVM Attach 机制动态注入 Agent,不修改代码、不重启应用。
# 从 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 .)
# 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 版本 | 启动命令 | 说明 |
|---|---|---|
| 命令 | 作用 |
|---|---|
💡 为什么
thread -n 1常显示 Arthas 自身线程?
因为 Arthas 本身在采样,用-i 500增加采样时间即可解决(见下文)。
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)
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(); } } }
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)
| 步骤 | 操作 | 关键命令 | 说明 |
|---|---|---|---|
✅ 核心口诀:
-cp .启动 +-i 500采样 = 看到真实业务代码
| 场景 | 举例 | Arthas 命令 |
|---|---|---|
Attach API(jdk.attach 模块)附加到目标进程。arhats-agent.jar)。ThreadMXBean 获取线程 CPU 时间。Sampling(采样)统计 CPU 使用率(默认 100ms)。.class 文件有调试信息)。⚙️ 为什么
thread -n 1有时显示 Arthas 自身线程?
因为采样过程本身会短暂占用 CPU,用-i 500增加采样时间即可平滑干扰。
| 事项 | 说明 | 解决方案 |
|---|---|---|
⚠️ 重要:
Arthas 不是监控系统,是诊断工具 —— 用完立刻退出,避免长期影响生产环境。
dashboard:
dashboard # 实时看 CPU/内存/线程,按 q 退出
thread -n 1 -i 500 快速定位,再深入分析。# 启动时强制加载模块(备用方案) java -cp . --add-modules java.instrument com.xxx.Main
自动化脚本:
.bat 脚本一键启动 + 诊断:
@echo off cd /d D:\my-project\out\production\jdk-21-test java -cp . com.my.test.multiThread.ArthasTest & timeout /t 3 java -jar arthas-boot.jar
Arthas 是 Java 线上问题的“手术刀”,但必须按 JDK 21 规则使用:
启动命令加-cp .→ 诊断命令用-i 500→ 用完立刻退出。
你已成功解决模块化问题,现在可以 100% 诊断真实 CPU 问题!
💡 记住:
thread -n 1 -i 500= 看到ArthasTest.java:21thread -n 1= 看到arthas-command-execute(干扰!)
现在你可以自信地用 Arthas 诊断任何 Java 问题了!🔥
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。