阿里內部的那個牛逼帶閃電的Java診斷工具終於開源了

codeGoogle發表於2018-12-27

最近發現一個好玩的東西給大家分享一下-阿里的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

image.png

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的簡單介紹,要想真正的融會貫通,真正的把他作為一個排查問題的利器,還需要自己動手實踐下!所謂實踐出真知。

###閱讀更多

給大家推薦10個優秀的開源專案

Android面試整理(附答案)

老闆說,我們們的APP包體積太大了

Android快速啟動——黑白屏最優解決方案

Android螢幕配適、版本配適與多語言支援

相信自己,沒有做不到的,只有想不到的

在這裡獲得的不僅僅是技術!

#

相關文章