JVM 診斷神器-Arthas實戰

什麼是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/

  :啓動Arthas時監聽本機是否啓動java進程;由於本地沒有啓動java進程,所以啓動Arthas失敗,下面提示信息也說的很清楚了~

本地測試Arthas源碼包:https://cyb-data-backup.oss-cn-guangzhou.aliyuncs.com/java/Arthas/arthas-packaging-3.6.9-bin.zip

使用

  • 運行日誌路徑 ~/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

  :每個命令如何使用,直接點進去查看示例教程即可~

JVM命令實戰

  • dashboard - 當前系統的實時數據面板
  • getstatic - 查看類的靜態屬性  
  • heapdump - dump java heap, 類似 jmap 命令的 heap dump 功能
  • jvm - 查看當前 JVM 的信息
  • logger - 查看和修改 logger
  • mbean - 查看 Mbean 的信息
  • memory - 查看 JVM 的內存信息
  • ognl - 執行 ognl 表達式
  • perfcounter - 查看當前 JVM 的 Perf Counter 信息
  • sysenv - 查看 JVM 的環境變量
  • sysprop - 查看和修改 JVM 的系統屬性
  • thread - 查看當前 JVM 的線程堆棧信息
  • vmoption - 查看和修改 JVM 裏診斷相關的 option
  • vmtool - 從 jvm 裏查詢對象,執行 forceGc

dashboard

字段說明
id Java 級別的線程 ID
name 線程名稱
group 線程組名稱
proirity 線程優先級,1 ~ 10 之間的數字,越大優先級越高
state 線程的狀態
cpu 線程的 cpu 使用率
delta_time 上次採樣之後線程運行增量 CPU 時間,數據格式爲秒
time 線程運行總 CPU 時間,數據格式爲 分:秒
interupted 當前線程是否中斷
daemon 是否是 daemon 守護線程
字段說明
used 當前使用了多少內存
total 總共分配了多少內存
max 最大使用了多少
usage 使用比例
gc 垃圾回收器

 

thread

參數說明

參數名稱參數說明
id 線程 id
[n:] 指定最忙的前 N 個線程並打印堆棧
[b] 找出當前阻塞其他線程的線程
[i <value>] 指定 cpu 使用率統計的採樣間隔,單位爲毫秒,默認值爲 200
[--all] 顯示所有匹配的線程

 

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 - 方法執行數據觀測
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章