最近發現一個好玩的東西給大家分享一下-阿里的Arthas 。在阿里巴巴內部,有很多自研工具供開發者使用,其中有一款工具,是幾乎每個Java開發都使用過的工具,那就是Arthas,這是一款Java診斷工具,是一款牛逼帶閃電的工具。該工具已於2018年9月份開源。
轉自作者:Java入門到入墳 | 連結:www.jianshu.com/p/25305a05b…
GitHub地址: github.com/alibaba/art…
使用者文件:alibaba.github.io/arthas/
在日常開發中,你是否遇到過以下問題:
-
這個類從哪個 jar 包載入的?為什麼會報各種類相關的 Exception?
-
我改的程式碼為什麼沒有執行到?難道是我沒 commit?分支搞錯了?
-
遇到問題無法線上上 debug,難道只能通過加日誌再重新發布嗎?
-
線上遇到某個使用者的資料處理有問題,但線上同樣無法 debug,線下無法重現!
-
是否有一個全域性視角來檢視系統的執行狀況?
-
有什麼辦法可以監控到JVM的實時執行狀態?
以上問題,通通可以通過Arthas來進行問題診斷!!!是不是很好很強大。
Arthas支援JDK 6+,採用命令列互動模式,同時提供豐富的Tab自動補全功能,進一步方便進行問題的定位和診斷。
Arthas安裝
1、使用arthas-boot安裝
下載arthas-boot.jar,然後用java -jar的方式啟動:
列印幫助資訊:
如果下載速度比較慢,可以使用aliyun的映象:
2、使用as.sh安裝
Arthas 支援在 Linux/Unix/Mac 等平臺上一鍵安裝,請複製以下內容,並貼上到命令列中,敲 回車 執行即可:
上述命令會下載啟動指令碼檔案 as.sh 到當前目錄,你可以放在任何地方或將其加入到 $PATH 中。
直接在shell下面執行./as.sh,就會進入互動介面。
也可以執行./as.sh -h來獲取更多引數資訊。
快速入門
1. 啟動Demo
arthas-demo是一個簡單的程式,每隔一秒生成一個隨機數,再執行質因式分解,並列印出分解結果。
2. 啟動arthas
在命令列下面執行:
執行該程式的使用者需要和目標程式具有相同的許可權。比如以admin使用者來執行:sudo su admin && java -jar arthas-boot.jar或sudo -u admin -EH java -jar arthas-boot.jar。
如果attatch不上目標程式,可以檢視~/logs/arthas/目錄下的日誌。
如果下載速度比較慢,可以使用aliyun的映象:java -jar arthas-boot.jar --repo-mirror aliyun --use-http
java -jar arthas-boot.jar -h列印更多引數資訊。
選擇應用java程式:
Demo程式是第2個,則輸入2,再輸入回車/enter。Arthas會attach到目標程式上,並輸出日誌:
3. 檢視dashboard
輸入dashboard,按enter/回車,會展示當前程式的資訊,按ctrl+c可以中斷執行。
4. 通過sysenv命令來獲取到程式的Main Class
5. 通過jad來反編繹Main Class
6. watch
通過watch命令來檢視demo.MathGame#primeFactors函式的返回值:
5. 退出arthas
如果只是退出當前的連線,可以用quit或者exit命令。Attach到目標程式上的arthas還會繼續執行,埠會保持開放,下次連線時可以直接連線上。
如果想完全退出arthas,可以執行shutdown命令。
常用命令
基礎命令
help——檢視命令幫助資訊
cls——清空當前螢幕區域
session——檢視當前會話的資訊
reset——重置增強類,將被 Arthas 增強過的類全部還原,Arthas 服務端關閉時會重置所有增強過的類
version——輸出當前目標 Java 程式所載入的 Arthas 版本號
quit——退出當前 Arthas 客戶端,其他 Arthas 客戶端不受影響
shutdown——關閉 Arthas 服務端,所有 Arthas 客戶端全部退出
keymap——Arthas快捷鍵列表及自定義快捷鍵
** jvm相關**
dashboard——當前系統的實時資料皮膚
thread——檢視當前 JVM 的執行緒堆疊資訊
jvm——檢視當前 JVM 的資訊
sysprop——檢視和修改JVM的系統屬性
New! getstatic——檢視類的靜態屬性
class/classloader相關
- sc——檢視JVM已載入的類資訊
- sm——檢視已載入類的方法資訊
- dump——dump 已載入類的 byte code 到特定目錄
- redefine——載入外部的.class檔案,redefine到JVM裡
- jad——反編譯指定已載入類的原始碼
classloader——檢視classloader的繼承樹,urls,類載入資訊,使用classloader去getResource
monitor/watch/trace相關
- monitor——方法執行監控
- watch——方法執行資料觀測
- trace——方法內部呼叫路徑,並輸出方法路徑上的每個節點上耗時
- stack——輸出當前方法被呼叫的呼叫路徑
- tt——方法執行資料的時空隧道,記錄下指定方法每次呼叫的入參和返回資訊,並能對這些不同的時間下呼叫進行觀測
請注意,這些命令,都通過位元組碼增強技術來實現的,會在指定類的方法中插入一些切面來實現資料統計和觀測,因此線上上、預發使用時,請儘量明確需要觀測的類、方法以及條件,診斷結束要執行 shutdown 或將增強過的類執行 reset 命令。
options
options——檢視或設定Arthas全域性開關
管道
Arthas支援使用管道對上述命令的結果進行進一步的處理,如sm org.apache.log4j.Logger | grep
- grep——搜尋滿足條件的結果
- plaintext——將命令的結果去除顏色
- wc——按行統計輸出結果
以上,就是關於Arthas的簡單介紹,要想真正的融會貫通,真正的把他作為一個排查問題的利器,還需要自己動手實踐下!所謂實踐出真知。
###閱讀更多
相信自己,沒有做不到的,只有想不到的
在這裡獲得的不僅僅是技術!