Arthas是一款阿里巴巴開源的 Java 線上診斷工具,功能很是強大,能夠解決不少線上不方便解決的問題。html
Arthas診斷使用的是命令行交互模式,支持JDK6+,Linux、Mac、Windows 操做系統,命令還支持使用 tab
鍵對各類信息的自動補全,診斷起來很是利索。java
這是它的官方網站:git
https://alibaba.github.io/arthas/index.htmlgithub
Github地址:web
https://github.com/alibaba/arthasspring
讓咱們來看下 Arthas
的官方解釋。centos
當你遇到如下相似問題而一籌莫展時,Arthas能夠幫助你解決: 一、這個類從哪一個 jar 包加載的?爲何會報各類類相關的 Exception? 二、我改的代碼爲何沒有執行到?難道是我沒 commit?分支搞錯了? 三、遇到問題沒法在線上 debug,難道只能經過加日誌再從新發布嗎? 四、線上遇到某個用戶的數據處理有問題,但線上一樣沒法 debug,線下沒法重現!五、是否有一個全局視角來查看系統的運行情況? 六、有什麼辦法能夠監控到JVM的實時運行狀態? Arthas官網
看完是否是以爲太牛逼了?springboot
特別是它能夠在線反編譯類,能夠不用加日誌在線調試跟蹤問題代碼。app
既然這麼牛逼,確定有很多公司在使用吧,下面列出了官方給出的使用登陸順序圖。maven
官方推薦使用 arthas-boot
進行安裝,很是方便,如下是基於 Linux 系統環境進行演示,通常解決線上問題也是基於 Linux 環境。
在任何目錄下載 arthas-boot
這個包。
wget https://alibaba.github.io/arthas/arthas-boot.jar
[root@VM_0_7_centos ~]# wget https://alibaba.github.io/arthas/arthas-boot.jar
--2019-07-30 14:48:31-- https://alibaba.github.io/arthas/arthas-boot.jar
Resolving alibaba.github.io (alibaba.github.io)... 185.199.108.153, 185.199.109.153, 185.199.110.153, ...
Connecting to alibaba.github.io (alibaba.github.io)|185.199.108.153|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 98637 (96K) [application/java-archive]
Saving to: ‘arthas-boot.jar’
100%[==========================================================================================================>] 98,637 32.8KB/s in 2.9s
2019-07-30 14:48:36 (32.8 KB/s) - ‘arthas-boot.jar’ saved [98637/98637]
使用 java -jar
命令執行 arthas-boot
包。
java -jar arthas-boot.jar
[INFO] arthas-boot version: 3.1.1
[INFO] Found existing java process, please choose one and hit RETURN.
* [1]: 13062 spring-boot-best-practice-0.0.1-SNAPSHOT.jar
運行 arthas-boot
後,控制檯會顯示全部 Java 進程,選擇一個你須要診斷的進程。
如第二步所示,這裏有只有一個 Java 進程,輸入序號1,回車,Arthas會附到目標進程上,並輸出日誌:
[INFO] Start download arthas from remote server: https://maven.aliyun.com/repository/public/com/taobao/arthas/arthas-packaging/3.1.1/arthas-packaging-3.1.1-bin.zip
[INFO] Download arthas success.
[INFO] arthas home: /root/.arthas/lib/3.1.1/arthas
[INFO] Try to attach process 13062
[INFO] Attach process 13062 success.
[INFO] arthas-client connect 127.0.0.1 3658
,---. ,------. ,--------.,--. ,--. ,---. ,---.
/ O | .--. ''--. .--'| '--' | / O ' .-'
| .-. || '--'.' | | | .--. || .-. |`. `-.
| | | || | | | | | | || | | |.-' |
`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
wiki https://alibaba.github.io/arthas
tutorials https://alibaba.github.io/arthas/arthas-tutorials
version 3.1.1
pid 13062
time 2019-07-30 14:49:34
至此,安裝、啓動完成。
更多其餘安裝方式見:https://alibaba.github.io/arthas/install-detail.html
啓動完成後,當前光標會進入 arthas
的控制檯,接受各類操做命令。
下面,棧長會作幾個經常使用命令的演示,讓你們對它有一個基本的認識和快速上手的能力。
顯示當前系統的實時數據面板,按 ctrl+c 便可退出。
$ dashboard
查看當前 JVM 的線程堆棧信息。
thread id, 顯示指定線程的運行堆棧:
$ thread 20
顯示當前最忙的前N個線程並打印堆棧:
$ thread -n 3
查看 JVM 已加載的類詳細信息。
$ sc -d *Test
查看已加載類的方法信息。
$ sm -d cn.javastack.springbootbestpractice.SpringBootBestPracticeApplication main
反編譯指定已加載類的源代碼。
$ jad cn.javastack.springbootbestpractice.SpringBootBestPracticeApplication
顯示方法內部調用路徑,非實時返回的命令並輸出方法路徑上的總耗時,以及的每一個節點上的詳細耗時。
$ trace -j cn.javastack.springbootbestpractice.web.JsonTest getUserInfo
-j:表示跳過 JDK 中的方法路徑。
對某個方法的調用進行定時監控。
$ monitor cn.javastack.springbootbestpractice.web.JsonTest getUserInfo -c 5
-c 5:表示每5秒統計一次,統計週期,默認值爲120秒。
監控維度說明:
監控項 | 說明 |
---|---|
timestamp | 時間戳 |
class | 類名 |
method | 方法名 |
total | 調用次數 |
success | 成功次數 |
fail | 失敗次數 |
rt | 平均響應時間 |
fail-rate | 失敗率 |
觀測方法執行數據,能方便的觀察到指定方法的調用狀況,如:返回值、拋出異常、入參等。
$ watch cn.javastack.springbootbestpractice.web.JsonTest getUserInfo '{params, returnObj}' -x 2 -b
以上監控的是一個方法的入參狀況,在方法執行前監控:-b,遍歷深度:-x 2。
退出當前 Arthas。
這個命令僅退出當前鏈接的客戶端,附到目標進程上的 Arthas 會繼續運行,端口不會關閉,下次鏈接時能夠直接鏈接使用。
關閉 Arthas 服務端,退出全部 Arthas 客戶端。
以上演示了 10 個命令的基本使用,各類命令的使用詳情能夠在命令帶 --help
進行查閱。
更多其餘命令請參考:
https://alibaba.github.io/arthas/commands.html
總結下來,使用 Arthas 能夠很方便的診斷一個 Java 應用程序,如:系統數據面板、JVM實時運行狀態、類加載狀況、監控方法執行狀況、顯示方法執行路徑等。
Arthas這些實用的功能確實能夠幫助咱們解決一些常見的線上問題,也能獨立於應用程序代碼,但僅侷限於在一個 JVM 進程內,若是是分佈式系統,Arthas就有點難了。
好了,今天的文章就到這了,大家也在用 Arthas 嗎?歡迎留言分享使用心得,若是以爲文章不錯,也能夠分享給你的同窗、同事們。