Arthas 是Alibaba開源的Java診斷工具,深受開發者喜愛。當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:
- 這個類從哪個 jar 包加載的?為什么會報各種類相關的 Exception?
- 我改的代碼為什么沒有執行到?難道是我沒 commit?分支搞錯了?
- 遇到問題無法在線上 debug,難道只能通過加日志再重新發布嗎?
- 線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!
- 是否有一個全局視角來查看系統的運行狀況?
- 有什么辦法可以監控到JVM的實時運行狀態?
- 怎么快速定位應用的熱點,生成火焰圖?
Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷。
Arthas 的命令、功能在其官方文檔有詳細介紹,對于Arthas的使用我最近會出一個整套系列文章,來講述我們日常是怎么用Arthas定位和排查問題!
擴展:java Instrumentation指的是可以用獨立于應用程序之外的代理(agent)程序來監測和協助運行在JVM上的應用程序。這種監測和協助包括但不限于獲取JVM運行時狀態,替換和修改類定義等。Arthas 的整體邏輯也是在 Java 的Instrumentation基礎上來實現。
Arthas的操作流程(簡易)
官方提供了兩種使用方式 下載arthas-boot.jar 或者直接安裝使用 as. sh。這里說明前一種。
一、下載arthas-boot.jar
注明:個人環境是Mac環境,其他環境可借鑒參考
會將目標文件下載到當前目錄中。
二、運行arthas-boot.jar
可以看到執行 java -jar arthas-boot.jar之后,它羅列了當前的java進程供你選擇,選擇之后,就可以對該進程進行監控了。(也可以直接增加pid監控,如:java -jar arthas-boot.jar pid)。在選擇好pid之后,它首先會將 arthas所需要的jar相關文件進行下載,然后做一些初始化的工作。
注:最后一行‘[arthas@1640]$’ ,說明打開進入了監控客戶端,在這里就可以執行相關命令進行查看了。可以使用quit(退出當前客戶端)、stop\shutdown(關閉arthas服務端,并退出所有客戶端)。除了在命令行查看外,還可以通過瀏覽器訪問http://127.0.0.1:8563/查看。如下圖:
當我們在shell端執行quit,并重新java -jar arthas-boot.jar 1640當前進程后。會有這樣一個提示(表示目標進程已被監聽,跳過attach)本篇暫時不講attach機制相關內容,感興趣的朋友可自行先查閱資料,后續篇章會慢慢講解。
這里是下載好之后的文件列表,也就是直接執行第二種安裝方式‘curl -L https://alibaba.github.io/arthas/install.sh | sh’安裝的文件。
三、簡單操作arthas
通過輸入help可以看到,提供了很多的功能,tab可自動補全功能,
以下列表中標有注1的需要知道,這些命令通過asm字節碼增強技術來實現,會在指定的方法中插入一些切面來實現數據統計及觀測功能。因此在線上、預發環境使用時,要明確需要觀測的類、方法及條件。診斷結束后要shutdown或者執行reset命令。
這里就挑幾個常用的命令進行展示:
- dashboard:查看jvm\線程\env基本信息(上面瀏覽器查看效果)
- thread:查看線程的運行狀態
- jad:反編譯class文件[通過自動補全,查找上線代碼是否包含自己新增的功能,很方便]
【以下的這幾個通過簡單測試代碼進行試用】
– sc:查看jvm中已經加載的類信息
– stack:調用棧信息
– Track:觀察方法執行的時候哪個子調用比較慢:
– watch:觀察方法的執行入參
3.1 dashboard
主要展示了三部分內容,線程,jvm,java-env。每過幾秒會自動刷新
3.2 Thread
可以用來顯示線程的一些基本信息,使用語法如下
例如使用 -n ,顯示幾條線程信息,根據cpu使用率排序
3.3 jad
可以用來檢查線上的發布代碼是否是最新的。可以定位到具體類,或者具體方法。很方便.
3.4 mc redefine
編譯類,并外部加載。
可以查看
3.5 sc
查看jvm中加載的類的信息
例如查看java.util.Stack類信息
對于Arthas的使用我最近會出一個整套系列文章,來講述我們日常是怎么用Arthas定位和排查問題!正在寫案例中...敬請期待!
作者 | 智哥
本文為碼農架構原創內容,未經允許不得轉載。