在阿里巴巴內(nèi)部,有很多自研工具供開發(fā)者使用,其中有一款工具,是幾乎每個(gè)Java開發(fā)都使用過(guò)的工具,那就是Arthas,這是一款Java診斷工具,是一款牛逼帶閃電的工具。該工具已于2018年9月份開源。
GitHub地址:https://github.com/alibaba/arthas
用戶文檔:https://alibaba.github.io/arthas/
在日常開發(fā)中,你是否遇到過(guò)以下問題:
這個(gè)類從哪個(gè) jar 包加載的?為什么會(huì)報(bào)各種類相關(guān)的 Exception?
我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯(cuò)了?
遇到問題無(wú)法在線上 debug,難道只能通過(guò)加日志再重新發(fā)布嗎?
線上遇到某個(gè)用戶的數(shù)據(jù)處理有問題,但線上同樣無(wú)法 debug,線下無(wú)法重現(xiàn)!
是否有一個(gè)全局視角來(lái)查看系統(tǒng)的運(yùn)行狀況?
有什么辦法可以監(jiān)控到JVM的實(shí)時(shí)運(yùn)行狀態(tài)?
以上問題,通通可以通過(guò)Arthas來(lái)進(jìn)行問題診斷?。?!是不是很好很強(qiáng)大。
Arthas支持JDK 6+,采用命令行交互模式,同時(shí)提供豐富的Tab自動(dòng)補(bǔ)全功能,進(jìn)一步方便進(jìn)行問題的定位和診斷。
Arthas安裝
1、使用arthas-boot安裝
下載arthas-boot.jar,然后用java -jar的方式啟動(dòng):
打印幫助信息:
如果下載速度比較慢,可以使用aliyun的鏡像:
2、使用as.sh安裝
Arthas 支持在 Linux/Unix/Mac 等平臺(tái)上一鍵安裝,請(qǐng)復(fù)制以下內(nèi)容,并粘貼到命令行中,敲 回車 執(zhí)行即可:
上述命令會(huì)下載啟動(dòng)腳本文件 as.sh 到當(dāng)前目錄,你可以放在任何地方或?qū)⑵浼尤氲?$PATH 中。
直接在shell下面執(zhí)行./as.sh,就會(huì)進(jìn)入交互界面。
也可以執(zhí)行./as.sh -h來(lái)獲取更多參數(shù)信息。
快速入門
1. 啟動(dòng)Demo
arthas-demo是一個(gè)簡(jiǎn)單的程序,每隔一秒生成一個(gè)隨機(jī)數(shù),再執(zhí)行質(zhì)因式分解,并打印出分解結(jié)果。
2. 啟動(dòng)arthas
在命令行下面執(zhí)行:
執(zhí)行該程序的用戶需要和目標(biāo)進(jìn)程具有相同的權(quán)限。比如以admin用戶來(lái)執(zhí)行:sudo su admin && java -jar arthas-boot.jar或sudo -u admin -EH java -jar arthas-boot.jar。
如果attatch不上目標(biāo)進(jìn)程,可以查看~/logs/arthas/目錄下的日志。
如果下載速度比較慢,可以使用aliyun的鏡像:java -jar arthas-boot.jar --repo-mirror aliyun --use-http
java -jar arthas-boot.jar -h打印更多參數(shù)信息。
選擇應(yīng)用java進(jìn)程:
Demo進(jìn)程是第2個(gè),則輸入2,再輸入回車/enter。Arthas會(huì)attach到目標(biāo)進(jìn)程上,并輸出日志:
3. 查看dashboard
輸入dashboard,按enter/回車,會(huì)展示當(dāng)前進(jìn)程的信息,按ctrl+c可以中斷執(zhí)行。
4. 通過(guò)sysenv命令來(lái)獲取到進(jìn)程的Main Class
5. 通過(guò)jad來(lái)反編繹Main Class
6. watch
通過(guò)watch命令來(lái)查看demo.MathGame#primeFactors函數(shù)的返回值:
5. 退出arthas
如果只是退出當(dāng)前的連接,可以用quit或者exit命令。Attach到目標(biāo)進(jìn)程上的arthas還會(huì)繼續(xù)運(yùn)行,端口會(huì)保持開放,下次連接時(shí)可以直接連接上。
如果想完全退出arthas,可以執(zhí)行shutdown命令。
常用命令
基礎(chǔ)命令
help——查看命令幫助信息
cls——清空當(dāng)前屏幕區(qū)域
session——查看當(dāng)前會(huì)話的信息
reset——重置增強(qiáng)類,將被 Arthas 增強(qiáng)過(guò)的類全部還原,Arthas 服務(wù)端關(guān)閉時(shí)會(huì)重置所有增強(qiáng)過(guò)的類
version——輸出當(dāng)前目標(biāo) Java 進(jìn)程所加載的 Arthas 版本號(hào)
quit——退出當(dāng)前 Arthas 客戶端,其他 Arthas 客戶端不受影響
shutdown——關(guān)閉 Arthas 服務(wù)端,所有 Arthas 客戶端全部退出
keymap——Arthas快捷鍵列表及自定義快捷鍵
jvm相關(guān)
dashboard——當(dāng)前系統(tǒng)的實(shí)時(shí)數(shù)據(jù)面板
thread——查看當(dāng)前 JVM 的線程堆棧信息
jvm——查看當(dāng)前 JVM 的信息
sysprop——查看和修改JVM的系統(tǒng)屬性
New! getstatic——查看類的靜態(tài)屬性
class/classloader相關(guān)
sc——查看JVM已加載的類信息
sm——查看已加載類的方法信息
dump——dump 已加載類的 byte code 到特定目錄
redefine——加載外部的.class文件,redefine到JVM里
jad——反編譯指定已加載類的源碼
classloader——查看classloader的繼承樹,urls,類加載信息,使用classloader去getResource
monitor/watch/trace相關(guān)
monitor——方法執(zhí)行監(jiān)控
watch——方法執(zhí)行數(shù)據(jù)觀測(cè)
trace——方法內(nèi)部調(diào)用路徑,并輸出方法路徑上的每個(gè)節(jié)點(diǎn)上耗時(shí)
stack——輸出當(dāng)前方法被調(diào)用的調(diào)用路徑
tt——方法執(zhí)行數(shù)據(jù)的時(shí)空隧道,記錄下指定方法每次調(diào)用的入?yún)⒑头祷匦畔?,并能?duì)這些不同的時(shí)間下調(diào)用進(jìn)行觀測(cè)
請(qǐng)注意,這些命令,都通過(guò)字節(jié)碼增強(qiáng)技術(shù)來(lái)實(shí)現(xiàn)的,會(huì)在指定類的方法中插入一些切面來(lái)實(shí)現(xiàn)數(shù)據(jù)統(tǒng)計(jì)和觀測(cè),因此在線上、預(yù)發(fā)使用時(shí),請(qǐng)盡量明確需要觀測(cè)的類、方法以及條件,診斷結(jié)束要執(zhí)行 shutdown 或?qū)⒃鰪?qiáng)過(guò)的類執(zhí)行 reset 命令。
options
options——查看或設(shè)置Arthas全局開關(guān)
管道
? ? ? ? Arthas支持使用管道對(duì)上述命令的結(jié)果進(jìn)行進(jìn)一步的處理,如sm org.apache.log4j.Logger | grep
grep——搜索滿足條件的結(jié)果
plaintext——將命令的結(jié)果去除顏色
wc——按行統(tǒng)計(jì)輸出結(jié)果
以上,就是關(guān)于Arthas的簡(jiǎn)單介紹,要想真正的融會(huì)貫通,真正的把他作為一個(gè)排查問題的利器,還需要自己動(dòng)手實(shí)踐下!所謂實(shí)踐出真知。