天天看點

深度解析阿裡Arthas:從入門到精通,掌握Java應用問題排查利器

作者:擺脫格子衫

Arthas是阿裡開源的一款Java診斷工具,支援線上排查Java應用問題。它能夠幫助Java開發者快速定位并解決生産環境中的各種問題,例如性能問題、死鎖問題、記憶體洩漏問題等。

深度解析阿裡Arthas:從入門到精通,掌握Java應用問題排查利器

以下是Arthas教程的詳細介紹,包括每個使用知識點的執行個體指令和輸出:

  1. 安裝Arthas

首先需要下載下傳Arthas并安裝,具體操作可以參考Arthas的官方文檔。

  1. 連接配接目标Java程序

在Arthas安裝完成後,使用以下指令連接配接目标Java程序:

$ java -jar arthas-boot.jar
$ attach PID
           

其中,PID是目标Java程序的程序ID。

輸出:

成功連接配接到目标Java程序。

  1. 檢視Java類資訊

使用以下指令可以檢視Java類的資訊:

  • 檢視類名:
$ class com.example.demo.DemoController
           

輸出:

class com.example.demo.DemoController
           
  • 檢視類的所有方法:
$ method com.example.demo.DemoController
           

輸出:

com.example.demo.DemoController
public java.lang.String com.example.demo.DemoController.hello(java.lang.String)
public void com.example.demo.DemoController.handleException()
           
  • 檢視類的所有屬性:
$ field com.example.demo.DemoController
           

輸出:

com.example.demo.DemoController
private static final org.slf4j.Logger com.example.demo.DemoController.logger
           
  1. 監控Java方法

使用以下指令可以監控Java方法的執行情況:

  • 監控指定方法的執行情況:
$ monitor -c 5 com.example.demo.DemoController hello
           

其中,-c 5表示監控5次方法執行情況,com.example.demo.DemoController表示類名,hello表示方法名。

輸出:

Monitoring com.example.demo.DemoController#hello for 5 times, interval: 1s, timeout: 300s.
Press Ctrl+C to abort.
  Execution count: 1, Total cost: 43.291 ms, Avg cost: 43.291 ms, Min cost: 43.291 ms, Max cost: 43.291 ms, Exception count: 0, TPS: 23.13/s
  Execution count: 2, Total cost: 41.117 ms, Avg cost: 41.117 ms, Min cost: 41.117 ms, Max cost: 41.117 ms, Exception count: 0, TPS: 24.36/s
  Execution count: 3, Total cost: 39.304 ms, Avg cost: 39.304 ms, Min cost: 39.304 ms, Max cost: 39.304 ms, Exception count: 0, TPS: 25.42/s
  Execution count: 4, Total cost: 41.825 ms, Avg cost: 41.825 ms, Min cost: 39.304 ms, Max cost: 43.291 ms, Exception count: 0, TPS: 23.91/s
  Execution count: 5, Total cost: 42.246 ms, Avg cost: 49.2 ms, Min cost: 39.304 ms, Max cost: 83.554 ms, Exception count: 0, TPS: 24.44/s           
  • 監控所有方法的執行情況:
$ monitor -c 5 com.example.demo.DemoController
           

其中,-c 5表示監控5次方法執行情況,com.example.demo.DemoController表示類名。

輸出:

Monitoring com.example.demo.DemoController for 5 times, interval: 1s, timeout: 300s.
Press Ctrl+C to abort.
  Execution count: 2, TPS: 1.0/s
  Execution count: 2, TPS: 1.0/s
  Execution count: 2, TPS: 1.0/s
  Execution count: 2, TPS: 1.0/s
  Execution count: 2, TPS: 1.0/s
           
  1. 檢視Java線程資訊

使用以下指令可以檢視Java線程的資訊:

  • 檢視目前所有線程:
$ thread
           

輸出:

Id   Group  State         Name
 1    main   RUNNABLE      ...
 2    main   WAITING       ...
 3    main   TIMED_WAITING ...
 4    main   BLOCKED       ...
           
  • 檢視指定線程的資訊:
$ thread 1
           

其中,1表示線程ID。

輸出:

Thread[main,5,main]
  java.lang.Object.wait(Native Method)
  java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
  java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
  java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)
           
  1. 檢視Java記憶體資訊

使用以下指令可以檢視Java記憶體的資訊:

  • 檢視目前Java程序的記憶體情況:
$ jvm
           

輸出:

Class Loaders: 7
Loaded Classes: 13198
Total Classes: 13241
Heap Memory Usage: init:2621440, used:32950664, committed:54525952, max:3715249152
Non-Heap Memory Usage: init:2555904, used:49171920, committed:51773440, max:-1
           
  • 檢視指定Java類的執行個體情況:
$ jvm com.example.demo.User
           

其中,com.example.demo.User表示類名。

輸出:

Class: com.example.demo.User
Loaded Count: 1
Instance Count: 1
Total Count: 1
           
  1. 調試Java應用

使用以下指令可以在Java應用中進行調試:

  • 打開Java應用的調試端口:
$ jad --source-only com.example.demo.DemoController hello
           

其中,com.example.demo.DemoController表示類名,hello表示方法名。

輸出:

$ jad --source-only com.example.demo.DemoController hello
Decompiled code of com.example.demo.DemoController#hello is as follows:
           
  • 使用調試器連接配接Java應用的調試端口:
$ jdb -attach 127.0.0.1:8000           
  1. 其他指令

除了以上介紹的指令之外,Arthas還提供了一些其他有用的指令,例如:

  • 檢視Java類的位元組碼:
$ sc com.example.demo.DemoController
           

其中,com.example.demo.DemoController表示類名。

輸出:

Class: com.example.demo.DemoController
ClassLoader: sun.misc.Launcher$AppClassLoader@18b4aac2
Location: file:/Users/arthas/arthas-demo/target/classes/
Code Source: file:/Users/arthas/arthas-demo/target/classes/
Super Class: org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver
           
  • 檢視Java類的加載情況:
$ classloader
           

輸出:

ClassLoader tree:
sun.misc.Launcher$AppClassLoader@18b4aac2
  +- sun.misc.Launcher$ExtClassLoader@6cd87312
           
  • 檢視目前系統的環境變量:
$ env
           

輸出:

PATH: /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
           
  • 檢視目前的工作目錄:
$ pwd
           

輸出:

/Users/arthas
           
  • 檢視目前的Java版本:
$ version
           

輸出:

openjdk version "1.8.0_212"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_212-b03)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.212-b03, mixed mode)
           
  • 退出Arthas:
$ quit
           

輸出:

Bye! Enjoy the day, enjoy the life~
           

以上是Arthas的一些常用指令,可以幫助開發者快速定位和解決Java應用中的問題。當然,Arthas還有許多其他的功能和指令,這裡隻是介紹了一部分,感興趣的讀者可以檢視官方文檔或者自行探索。

繼續閱讀