JVM 診斷神器-Arthas實戰

2023-06-05 12:01:13

什麼是Arthas(阿爾薩斯)

  • 阿里開源的Java診斷工具,它可以在執行時對Java應用程式進行動態診斷和偵錯

  • 當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決

    • 這個類從哪個 jar 包載入的?為什麼會報各種類相關的 Exception?
    • 我改的程式碼為什麼沒有執行到?難道是我沒 commit?分支搞錯了?
    • 遇到問題無法線上上 debug,難道只能通過加紀錄檔再重新發布嗎?
    • 線上遇到某個使用者的資料處理有問題,但線上同樣無法 debug,線下無法重現!
    • 是否有一個全域性視角來檢視系統的執行狀況?
    • 有什麼辦法可以監控到 JVM 的實時執行狀態?
    • 怎麼快速定位應用的熱點,生成火焰圖?
    • 怎樣直接從 JVM 內查詢某個類的範例?
  • 地址

環境說明

  Arthas 支援 JDK 6+,支援 Linux/Mac/Windows,採用命令列互動模式,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷。

安裝&下載

方式一

curl -O https://arthas.aliyun.com/math-game.jar
java -jar math-game.jar

方式二

官網地址:https://arthas.aliyun.com/

  • 執行紀錄檔路徑 ~/logs/arthas/arthas.log
  • 退出 arthas

    • 如果只是退出當前的連線,其他使用者端不受影響,可以用 quit或者exit命令
    • 目標程序上的 arthas 還會繼續執行,埠保持開放,下次連線時執行java -jar arthas-boot.jar可以直接連線上
    • 如果想完全退出 arthas,可以執行stop命令
    • 生產環境中,推薦使用:stop

常用基礎命令實戰

  • base64 - base64 編碼轉換,和 linux 裡的 base64 命令類似
  • cat - 列印檔案內容,和 linux 裡的 cat 命令類似
  • cls - 清空當前螢幕區域
  • echo - 列印引數,和 linux 裡的 echo 命令類似
  • grep - 匹配查詢,和 linux 裡的 grep 命令類似
  • help - 檢視命令幫助資訊
  • history - 列印命令歷史
  • keymap - Arthas 快捷鍵列表及自定義快捷鍵
  • pwd - 返回當前的工作目錄,和 linux 命令類似
  • quit - 退出當前 Arthas 使用者端,其他 Arthas 使用者端不受影響
  • reset - 重置增強類,將被 Arthas 增強過的類全部還原,Arthas 伺服器端關閉時會重置所有增強過的類
  • session - 檢視當前對談的資訊
  • stop - 關閉 Arthas 伺服器端,所有 Arthas 使用者端全部退出
  • tee - 複製標準輸入到標準輸出和指定的檔案,和 linux 裡的 tee 命令類似
  • version - 輸出當前目標 Java 程序所載入的 Arthas 版本號

其他命令:https://arthas.aliyun.com/doc/commands.html

heapdump

 

  • 生成堆疊快照 heapdump/Users/chenyanbin/Desktop/1.hprof

class/classloader 相關

  • classloader - 檢視 classloader 的繼承樹,urls,類載入資訊,使用 classloader 去 getResource
  • dump - dump 已載入類的 byte code 到特定目錄
  • jad - 反編譯指定已載入類的原始碼
  • mc - 記憶體編譯器,記憶體編譯.java檔案為.class檔案
  • redefine - 載入外部的.class檔案,redefine 到 JVM 裡
  • retransform - 載入外部的.class檔案,retransform 到 JVM 裡
  • sc - 檢視 JVM 已載入的類資訊
  • sm - 檢視已載入類的方法資訊

monitor/watch/trace 相關

  • monitor - 方法執行監控
  • stack - 輸出當前方法被呼叫的呼叫路徑
  • trace - 方法內部呼叫路徑,並輸出方法路徑上的每個節點上耗時
  • tt - 方法執行資料的時空隧道,記錄下指定方法每次呼叫的入參和返回資訊,並能對這些不同的時間下呼叫進行觀測
  • watch - 方法執行資料觀測