博客 / 詳情

返回

Arthas使用

 

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(按 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 時間。
    • 通過 Sampling(採樣)統計 CPU 使用率(默認 100ms)。
  4. 堆棧解析
    • 從 JVM 獲取線程棧 → 映射到源碼行號(需 .class 文件有調試信息)。

⚙️ 為什麼 thread -n 1 有時顯示 Arthas 自身線程?
因為採樣過程本身會短暫佔用 CPU,-i 500 增加採樣時間即可平滑干擾。


7. 注意事項

事項 説明 解決方案
性能影響 採樣時 CPU +1%~3% 僅在診斷時使用,用完關閉
必須關閉 長期運行會累積開銷 退出 Arthas:按 qexit
JDK 21 模塊化 -cp . 無法 attach 啓動命令必須加 -cp .
I/O 干擾 System.out.println 會掩蓋 CPU 問題 壓測時移除所有 I/O
線程名 業務線程名需明確 new Thread("MyThread") 命名

⚠️ 重要
Arthas 不是監控系統,是診斷工具 —— 用完立刻退出,避免長期影響生產環境。


8. 其他建議

  1. 優先用 dashboard
    dashboard  # 實時看 CPU/內存/線程,按 q 退出
  2. 避免在高負載時頻繁使用
    • 先用 thread -n 1 -i 500 快速定位,再深入分析。
  3. 生產環境安全
    • 在測試環境驗證 Arthas 命令,再上生產。
  4. JDK 21 專用技巧
    # 啓動時強制加載模塊(備用方案)
    java -cp . --add-modules java.instrument com.xxx.Main

    自動化腳本

  5. .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 問題了!🔥

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.