阿里開源 java 專案記憶體監控工具 arthas

ningmengban發表於2020-11-14

介紹

Arthas(阿爾薩斯)是阿里巴巴開源的 Java 診斷工具,實現了 jvm 自帶的幾乎所有診斷功能,深受 jvm 分析人員喜愛。

安裝

因為這個工具是 jar 檔案,需要有 Java 執行環境,所以請先確保系統安裝了 jre 或 JDK

# 檢測環境 java -version # 顯示類似如下,說明已經擁有java執行環境; # 如果報錯,請先安裝或檢查jre\jdk是否安裝且配置環境變數 openjdk version "1.8.0_252" OpenJDK Runtime Environment (build 1.8.0_252-b09) OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode) 
# linux系統 # 下載jar包 curl -O https://arthas.aliyun.com/arthas-boot.jar # 執行監控 java -jar arthas-boot.jar # 獲取工具幫助 java -jar arthas-boot.jar -h [INFO] arthas-boot version: 3.3.9 Usage: arthas-boot [-h] [--target-ip <value>] [--telnet-port <value>] [--http-port <value>] [--session-timeout <value>] [--arthas-home <value>] [--use-version <value>] [--repo-mirror <value>] [--versions] [--use-http] [--attach-only] [-c <value>] [-f <value>] [--height <value>] [--width <value>] [-v] [--tunnel-server <value>] [--agent-id <value>] [--stat-url <value>] [--select <value>] [pid] Bootstrap Arthas EXAMPLES: java -jar arthas-boot.jar <pid> java -jar arthas-boot.jar --target-ip 0.0.0.0 java -jar arthas-boot.jar --telnet-port 9999 --http-port -1 java -jar arthas-boot.jar --tunnel-server 'ws://192.168.10.11:7777/ws' java -jar arthas-boot.jar --tunnel-server 'ws://192.168.10.11:7777/ws' --agent-id bvDOe8XbTM2pQWjF4cfw java -jar arthas-boot.jar --stat-url 'http://192.168.10.11:8080/api/stat' java -jar arthas-boot.jar -c 'sysprop; thread' <pid> java -jar arthas-boot.jar -f batch.as <pid> java -jar arthas-boot.jar --use-version 3.3.9 java -jar arthas-boot.jar --versions java -jar arthas-boot.jar --select arthas-demo java -jar arthas-boot.jar --session-timeout 3600 java -jar arthas-boot.jar --attach-only java -jar arthas-boot.jar --repo-mirror aliyun --use-http WIKI: https://arthas.aliyun.com/doc Options and Arguments: -h,--help Print usage --target-ip <value> The target jvm listen ip, default 127.0.0.1 --telnet-port <value> The target jvm listen telnet port, default 3658 --http-port <value> The target jvm listen http port, default 8563 --session-timeout <value> The session timeout seconds, default 1800 (30min) --arthas-home <value> The arthas home --use-version <value> Use special version arthas --repo-mirror <value> Use special remote repository mirror, value is center/aliyun or http repo url. --versions List local and remote arthas versions --use-http Enforce use http to download, default use https --attach-only Attach target process only, do not connect -c,--command <value> Command to execute, multiple commands separated by ; -f,--batch-file <value> The batch file to execute --height <value> arthas-client terminal height --width <value> arthas-client terminal width -v,--verbose Verbose, print debug info. --tunnel-server <value> The tunnel server url --agent-id <value> The agent id register to tunnel server --stat-url <value> The report stat url --select <value> select target process by classname or JARfilename <pid> Target pid 

解除安裝: rm -rf ~/.arthas/

監控 Java 程式

執行 java -jar arthas-boot.jar

arthas01.png

 

如果當前系統有多個 Java 服務,則會顯示多個程式 id,選擇你要監控的服務 id,輸入前面中括號中的數值

想要檢視當前系統,是否有 Java 服務,可以執行: ps -ef |grep java 或者 jps 如果有返回,則說明當前系統有 Java 服務正在執行

也可以先找到系統的 Java 服務程式 id,然後直接執行:java -jar arthas-boot.jar java程式id

進入了 arthas 執行模式

arthas02.png

 

檢視當前程式資訊

執行 dashboard, 結束檢視,按 ctrl + c

arthas03.png

 

  • 執行緒相關
    • ID 執行緒 ID,這個 id 與 jstack 中的 nativeID 不同
    • NAME 執行緒名
      GROUP 執行緒組名
    • PRIORITY 優先順序,越大表示優先順序越高
    • STATE 執行緒狀態
    • %CPU CPU 消耗比,
    • TIME 總執行時長
    • INTERRUPTED 中斷狀態
    • DAEMON 是否為守護程式
  • 記憶體相關
    • heap 堆
    • eden_space 伊甸園區間
    • survivor_space 倖存者區間
    • tenured_gen
    • nonheap
    • code_cache 程式碼快取區
    • metaspace
  • GC 回收
    • gc.ps_scavenge.count
    • gc.ps_scavenge.time(ms)
    • gc.ps_marksweep.count
    • gc.ps_marksweep.time(ms)
  • Puntime
    • os.name
    • os.version
    • java.version
    • java.home
    • systemload.average
    • processors
    • uptime

獲取命令幫助

執行 dashboard -h

arthas04.png

 

-i 更新資料間隔時長,單位毫秒,預設間隔時長為 5 秒

-n 根據間隔時長,獲取資料,總共獲取的次數

arthas 中,所有命令都可以用 -h 引數,獲取命令的幫助資訊

其他常用命令

  • thread 顯示執行緒資訊和執行緒堆疊資訊
    • id 執行緒 id
      • thread 15 檢視執行緒號為 15 的執行緒資訊
    • -n X 指定最忙的前 X 個執行緒,並列印堆疊
      • thread -n 5 檢視當前最繁忙的前 5 個執行緒
    • -b 找出當前阻塞其他執行緒的執行緒
      • thread -b 檢視當前阻塞的執行緒
    • -i X 指定 CPU 佔比統計取樣間隔時長,單位毫秒,預設 5000ms
      • thread -i 2000 指定取樣間隔時長為 2 秒
      • thread -n 3 -i 2000 指定間隔 2 秒檢視最繁忙的前 3 個執行緒
    • --state 檢視指定狀態的執行緒,狀態有:[NEW, TERMINATED, WAITING, RUNNABLE, TIMED_WAITING, BLOCKED]
      • thread --state RUNNABLE
  • jvm 檢視當前 jvm 資訊

arthas05.png

 

  • JVM 引數
    • THREAD 執行緒相關
      • COUNT JVM 中活躍的執行緒數
      • DAEMON-COUNT 當前活躍的守護執行緒數
      • PEAK-COUNT 從 JVM 啟動開始曾經活著的最大執行緒數
      • STARTED-COUNT 從 JVM 啟動開始總共啟動過的執行緒數
        DEADLOCK-COUNT JVM 當前死鎖的執行緒數
    • FILE-DESCRIPTOR 檔案相關
      • MAX-FILE-DESCRIPTOR-COUNT 最大可以開啟的檔案描述符數
      • OPEN-FILE-DESCRIPTOR-COUNT 當前開啟的檔案描述符數
  • sysprop 檢視當前 jvm 的系統屬性 system-property
  • sysenv 檢視當前 jvm 的環境屬性 system-environment-variables
  • vmoptions 檢視、更新 vm 診斷相關的引數
  • perfcounter 檢視當前 jvm 的 perf count 資訊
  • logger 檢視 logger 資訊,更新 logger 級別
  • mbean 檢視或監控 Mbean 的屬性資訊

arthas06.png

 

  • sc 搜尋通過 JVM 載入的類資訊
  • sm 搜尋通過 JVM 載入的方法資訊
  • dump 已載入類的 bytecode 到特定目錄
  • jad 反編譯指定的載入類的原始碼
  • trace 方法內部呼叫路徑,並輸出方法路徑上的每個節點上耗時
  • stack 輸出當前方法被呼叫的呼叫路徑
  • tt 方法執行資料的時空隧道,記錄下指定方法每次呼叫的入參和返回資訊,並能對這些不同的時間下呼叫進行觀測
  • profiler 使用 async-profiler 生成火焰圖
  • cat 列印檔案內容,和 Linux 裡的 cat 命令類似
  • echo 列印引數,和 Linux 裡的 echo 命令類似
  • grep 類似傳統的 grep 命令
  • pwd 返回當前的工作目錄,和 Linux 命令類似
  • options 選項

本文由檸檬班Allen老師原創,轉載需註明出處!

學習資料領取加V:17352871687 (備註知乎)

相關文章