1. 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.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(按 |
實時監控(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 監控機制原理
- Attach 機制:
- 通過 JVM 的
Attach API(jdk.attach模塊)附加到目標進程。
- 通過 JVM 的
- Agent 注入:
- Arthas 以 Java Agent 方式注入字節碼(
arhats-agent.jar)。
- Arthas 以 Java Agent 方式注入字節碼(
- 採樣原理:
- 用
ThreadMXBean獲取線程 CPU 時間。 - 通過
Sampling(採樣)統計 CPU 使用率(默認 100ms)。
- 用
- 堆棧解析:
- 從 JVM 獲取線程棧 → 映射到源碼行號(需
.class文件有調試信息)。
- 從 JVM 獲取線程棧 → 映射到源碼行號(需
⚙️ 為什麼
thread -n 1有時顯示 Arthas 自身線程?
因為採樣過程本身會短暫佔用 CPU,用-i 500增加採樣時間即可平滑干擾。
7. 注意事項
| 事項 | 説明 | 解決方案 |
|---|---|---|
| 性能影響 | 採樣時 CPU +1%~3% | 僅在診斷時使用,用完關閉 |
| 必須關閉 | 長期運行會累積開銷 | 退出 Arthas:按 q 或 exit |
| JDK 21 模塊化 | 無 -cp . 無法 attach |
啓動命令必須加 -cp . |
| I/O 干擾 | System.out.println 會掩蓋 CPU 問題 |
壓測時移除所有 I/O |
| 線程名 | 業務線程名需明確 | 用 new Thread("MyThread") 命名 |
⚠️ 重要:
Arthas 不是監控系統,是診斷工具 —— 用完立刻退出,避免長期影響生產環境。
8. 其他建議
- 優先用
dashboard:dashboard # 實時看 CPU/內存/線程,按 q 退出
- 避免在高負載時頻繁使用:
- 先用
thread -n 1 -i 500快速定位,再深入分析。
- 先用
- 生產環境安全:
- 在測試環境驗證 Arthas 命令,再上生產。
- JDK 21 專用技巧:
# 啓動時強制加載模塊(備用方案) 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:21
thread -n 1= 看到arthas-command-execute(干擾!)
現在你可以自信地用 Arthas 診斷任何 Java 問題了!🔥