天天看點

推薦一款阿裡開源的 Java 診斷工具,好用到爆!

Arthas是什麼鬼?

Arthas是一款阿裡巴巴開源的 Java 線上診斷工具,功能非常強大,可以解決很多線上不友善解決的問題。

Arthas診斷使用的是指令行互動模式,支援JDK6+,Linux、Mac、Windows 作業系統,指令還支援使用 tab 鍵對各種資訊的自動補全,診斷起來非常利索。

這是它的官方網站:

https://alibaba.github.io/arthas/index.html Github位址: https://github.com/alibaba/arthas

Arthas能解決什麼問題?

讓我們來看下 Arthas 的官方解釋。

當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:

1、這個類從哪個 jar 包加載的?為什麼會報各種類相關的 Exception?

2、我改的代碼為什麼沒有執行到?難道是我沒 commit?分支搞錯了?

3、遇到問題無法線上上 debug,難道隻能通過加日志再重新釋出嗎?

4、線上遇到某個使用者的資料處理有問題,但線上同樣無法 debug,線下無法重制!

5、是否有一個全局視角來檢視系統的運作狀況?

6、有什麼辦法可以監控到JVM的實時運作狀态?

看完是不是覺得太牛逼了?

特别是它可以線上反編譯類,可以不用加日志線上調試跟蹤問題代碼。

既然這麼牛逼,肯定有不少公司在使用吧,下面列出了官方給出的使用登入順序圖。

推薦一款阿裡開源的 Java 診斷工具,好用到爆!

快速安裝

官方推薦使用 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 的控制台,接受各種操作指令。

下面,棧長會做幾個常用指令的示範,讓大家對它有一個基本的認識和快速上手的能力。

1、dashboard

顯示目前系統的實時資料面闆,按 ctrl+c 即可退出。

$ dashboard

推薦一款阿裡開源的 Java 診斷工具,好用到爆!

2、thread

檢視目前 JVM 的線程堆棧資訊。

thread id, 顯示指定線程的運作堆棧:

$ thread 20
推薦一款阿裡開源的 Java 診斷工具,好用到爆!

顯示目前最忙的前N個線程并列印堆棧:

$ thread -n 3
推薦一款阿裡開源的 Java 診斷工具,好用到爆!

3、sc

檢視 JVM 已加載的類詳細資訊。

$ sc -d *Test
推薦一款阿裡開源的 Java 診斷工具,好用到爆!

4、sm

檢視已加載類的方法資訊。

$ sm -d cn.javastack.springbootbestpractice.SpringBootBestPracticeApplication main
推薦一款阿裡開源的 Java 診斷工具,好用到爆!

5、jad

反編譯指定已加載類的源代碼。

$ jad cn.javastack.springbootbestpractice.SpringBootBestPracticeApplication
推薦一款阿裡開源的 Java 診斷工具,好用到爆!

6、trace

顯示方法内部調用路徑,非實時傳回的指令并輸出方法路徑上的總耗時,以及的每個節點上的詳細耗時。

$ trace -j cn.javastack.springbootbestpractice.web.JsonTest getUserInfo
推薦一款阿裡開源的 Java 診斷工具,好用到爆!

-j:表示跳過 JDK 中的方法路徑。

7、monitor

對某個方法的調用進行定時監控。

$ monitor cn.javastack.springbootbestpractice.web.JsonTest getUserInfo -c 5
推薦一款阿裡開源的 Java 診斷工具,好用到爆!
-c 5:表示每5秒統計一次,統計周期,預設值為120秒。
監控次元說明:
推薦一款阿裡開源的 Java 診斷工具,好用到爆!

8、watch

觀測方法執行資料,能友善的觀察到指定方法的調用情況,如:傳回值、抛出異常、入參等。

$ watch cn.javastack.springbootbestpractice.web.JsonTest getUserInfo ‘{params, returnObj}’ -x 2 -b

推薦一款阿裡開源的 Java 診斷工具,好用到爆!

以上監控的是一個方法的入參情況,在方法執行前監控:-b,周遊深度:-x 2。

9、quit/exit

退出目前 Arthas。

這個指令僅退出目前連接配接的用戶端,附到目标程序上的 Arthas 會繼續運作,端口不會關閉,下次連接配接時可以直接連接配接使用。

10、shutdown

關閉 Arthas 服務端,退出所有 Arthas 用戶端。

以上示範了 10 個指令的基本使用,各種指令的使用詳情可以在指令帶 --help 進行查閱。

推薦一款阿裡開源的 Java 診斷工具,好用到爆!

更多其他指令請參考:

https://alibaba.github.io/arthas/commands.html

總結

總結下來,使用 Arthas 可以很友善的診斷一個 Java 應用程式,如:系統資料面闆、JVM實時運作狀态、類加載情況、監控方法執行情況、顯示方法執行路徑等。

Arthas這些實用的功能确實可以幫助我們解決一些常見的線上問題,也能獨立于應用程式代碼,但僅局限于在一個 JVM 程序内,如果是分布式系統,Arthas就有點難了。

好了,今天的文章就到這了,你們也在用 Arthas 嗎?歡迎留言分享使用心得,如果覺得文章不錯,也可以分享給你的同學、同僚們。