Arthas 是Alibaba開源的Java診斷工具,深受開發(fā)者喜愛。當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:
- 這個類從哪個 jar 包加載的?為什么會報各種類相關的 Exception?
- 我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯了?
- 遇到問題無法在線上 debug,難道只能通過加日志再重新發(fā)布嗎?
- 線上遇到某個用戶的數(shù)據(jù)處理有問題,但線上同樣無法 debug,線下無法重現(xiàn)!
- 是否有一個全局視角來查看系統(tǒng)的運行狀況?
- 有什么辦法可以監(jiān)控到JVM的實時運行狀態(tài)?
- 怎么快速定位應用的熱點,生成火焰圖?
Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷。
Arthas 的命令、功能在其官方文檔有詳細介紹,對于Arthas的使用我最近會出一個整套系列文章,來講述我們日常是怎么用Arthas定位和排查問題!

擴展:java Instrumentation指的是可以用獨立于應用程序之外的代理(agent)程序來監(jiān)測和協(xié)助運行在JVM上的應用程序。這種監(jiān)測和協(xié)助包括但不限于獲取JVM運行時狀態(tài),替換和修改類定義等。Arthas 的整體邏輯也是在 Java 的Instrumentation基礎上來實現(xiàn)。
Arthas的操作流程(簡易)
官方提供了兩種使用方式 下載arthas-boot.jar 或者直接安裝使用 as. sh。這里說明前一種。
一、下載arthas-boot.jar
注明:個人環(huán)境是Mac環(huán)境,其他環(huán)境可借鑒參考

會將目標文件下載到當前目錄中。
二、運行arthas-boot.jar
可以看到執(zhí)行 java -jar arthas-boot.jar之后,它羅列了當前的java進程供你選擇,選擇之后,就可以對該進程進行監(jiān)控了。(也可以直接增加pid監(jiān)控,如:java -jar arthas-boot.jar pid)。在選擇好pid之后,它首先會將 arthas所需要的jar相關文件進行下載,然后做一些初始化的工作。

注:最后一行‘[arthas@1640]$’ ,說明打開進入了監(jiān)控客戶端,在這里就可以執(zhí)行相關命令進行查看了。可以使用quit(退出當前客戶端)、stop\shutdown(關閉arthas服務端,并退出所有客戶端)。除了在命令行查看外,還可以通過瀏覽器訪問http://127.0.0.1:8563/查看。如下圖:

當我們在shell端執(zhí)行quit,并重新java -jar arthas-boot.jar 1640當前進程后。會有這樣一個提示(表示目標進程已被監(jiān)聽,跳過attach)本篇暫時不講attach機制相關內容,感興趣的朋友可自行先查閱資料,后續(xù)篇章會慢慢講解。
這里是下載好之后的文件列表,也就是直接執(zhí)行第二種安裝方式‘curl -L https://alibaba.github.io/arthas/install.sh | sh’安裝的文件。

三、簡單操作arthas
通過輸入help可以看到,提供了很多的功能,tab可自動補全功能,
以下列表中標有注1的需要知道,這些命令通過asm字節(jié)碼增強技術來實現(xiàn),會在指定的方法中插入一些切面來實現(xiàn)數(shù)據(jù)統(tǒng)計及觀測功能。因此在線上、預發(fā)環(huán)境使用時,要明確需要觀測的類、方法及條件。診斷結束后要shutdown或者執(zhí)行reset命令。

這里就挑幾個常用的命令進行展示:
- dashboard:查看jvm\線程\env基本信息(上面瀏覽器查看效果)
- thread:查看線程的運行狀態(tài)
- jad:反編譯class文件[通過自動補全,查找上線代碼是否包含自己新增的功能,很方便]
【以下的這幾個通過簡單測試代碼進行試用】
– sc:查看jvm中已經加載的類信息
– stack:調用棧信息
– Track:觀察方法執(zhí)行的時候哪個子調用比較慢:
– watch:觀察方法的執(zhí)行入?yún)?/p>
3.1 dashboard
主要展示了三部分內容,線程,jvm,java-env。每過幾秒會自動刷新

3.2 Thread
可以用來顯示線程的一些基本信息,使用語法如下

例如使用 -n ,顯示幾條線程信息,根據(jù)cpu使用率排序

3.3 jad
可以用來檢查線上的發(fā)布代碼是否是最新的??梢远ㄎ坏骄唧w類,或者具體方法。很方便.

3.4 mc redefine
編譯類,并外部加載。
可以查看
3.5 sc
查看jvm中加載的類的信息

例如查看java.util.Stack類信息
對于Arthas的使用我最近會出一個整套系列文章,來講述我們日常是怎么用Arthas定位和排查問題!正在寫案例中...敬請期待!
作者 | 智哥
本文為碼農架構原創(chuàng)內容,未經允許不得轉載。