中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java線上診斷工具Arthas的使用方法

發布時間:2021-09-13 14:10:55 來源:億速云 閱讀:134 作者:柒染 欄目:大數據

這篇文章將為大家詳細講解有關Java線上診斷工具Arthas的使用方法,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

排查一些生產環境問題,確實蠻好用的。

功能

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

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

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

  3. 遇到問題無法在線上 debug,難道只能通過加日志再重新發布嗎?

  4. 線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!

  5. 是否有一個全局視角來查看系統的運行狀況?

  6. 有什么辦法可以監控到JVM的實時運行狀態?

使用示例

環境安裝

wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar

上面的啟動方式,只能在本地訪問。默認的ip是 127.0.0.1,這種情況只命令行交互或者用 http://127.0.0.1:8563/ 來訪問。如果想要在別的機器上通過網頁的方式訪問,可以在啟動命令后帶上 --target-ip 本機ip,這樣就可以在別的機器(前提是機器可以互相訪問,且端口是開的)通過網頁訪問這個 arthas 客戶端了。如下:

root@iZuf63uqehzec73094965jZ:/data/arthas# java -jar arthas-boot.jar  --target-ip 139.**.**.112
[INFO] arthas-boot version: 3.1.4
[INFO] Found existing java process, please choose one and hit RETURN.
* [1]: 1701 stock.war
  [2]: 15658 /data/secret/web/secret-web.jar
2
[INFO] arthas home: /root/.arthas/lib/3.1.4/arthas
[INFO] Try to attach process 15658
[INFO] Attach process 15658 success.
[INFO] arthas-client connect 139.**.**.112 3658
  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.
 /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'


wiki      https://alibaba.github.io/arthas
tutorials https://alibaba.github.io/arthas/arthas-tutorials
version   3.1.4
pid       15658
time      2019-10-31 00:16:59

最后可以通過如下方式訪問,跟在本機之前敲命令行是一樣的。

http://139...112:8563/

Java線上診斷工具Arthas的使用方法

trace命令(追蹤某個方法的執行耗時情況,支持多方法,時間過濾)

這個命令用來追蹤方法的執行性能,支持按照時間過濾,更詳細的參考官方文檔 trace命令

正常單層跟蹤調用鏈路

命令:

trace com.zero.secret.web.controller.AlbumController home

效果:

Java線上診斷工具Arthas的使用方法

結果里面,第一列是該方法的耗時,第二列是具體的方法,第三列是 代碼所在的行號

篩選時間

有時候方法內的方法太多,可以根據時間過濾,篩選出超哥某個時間的方法。命令如下:

trace com.zero.secret.web.controller.AlbumController home '#cost > 10'

帶上時間過濾測試的沒有效果,下次再試試。

深層次跟蹤調用鏈路

trace命令只能跟蹤一層,如果想要跟蹤更深層的方法,可以用多方法。

trace -E  com.zero.secret.web.controller.AlbumController|com.zero.secret.dal.mapper.AlbumMapper  home|selectByPrimaryKey

Java線上診斷工具Arthas的使用方法

注意:

  1. trace本身是有耗時的,這里面顯示的耗時沒有減去trace本身的耗時

watch命令(支持在線查看變量的值)

詳細的watch命令查看官方文檔。watch命令

命令:

watch com.zero.secret.service.AlbumService getAlbum "{params,returnObj}" -x 2

Java線上診斷工具Arthas的使用方法

這里 -x 2 表示參數深度顯示2層,默認只顯示一層。下面是一層的返回結果,比對看看

Java線上診斷工具Arthas的使用方法

這里入參的值就沒有顯示出來。

有時候要比對 參數在進入方法之前跟執行方法之后的值,比較著看 參數的值的變化,可以添加參數 -b -s 。命令如下:

watch com.zero.secret.service.AlbumService getAlbum "{params,returnObj}" -x 2 -b -s

結果如下:

Java線上診斷工具Arthas的使用方法

這里返回的有兩組值。第一組值是進入方法時的入參和返回值,第二組是方法執行結束時的入參和返回值。

stack(查看方法調用鏈路)

詳細stack命令參考官方文檔 stack命令。

在一些復雜業務中,如果不知道某一個方法的調用鏈路,可以用這個命令查看調用鏈路。或者 不同的業務場景調用鏈路不一樣時,也可以使用這個命令確定某個業務數據的調用鏈路。

命令如下:

stack  com.zero.secret.service.AlbumService getAlbum

效果如下:

Java線上診斷工具Arthas的使用方法

monitor (監控某個方法在一段時間內容的執行次數、成功的次數,失敗的次數,平均耗時)

該命令的官方文檔 monitor

命令如下:

monitor -c 10  com.zero.secret.web.controller.AlbumController home

上面是10s 統計一次。

結果如下:

Java線上診斷工具Arthas的使用方法

dashboard(查看JVM 資源占用及垃圾回收情況)

thread(可以查看CPU資源占用靠前的幾個線程詳情,阻塞線程)

詳情參考 thread 命令 這個命令可以查看當前CPU資源占用比較靠前的幾個線程詳情,能直觀的看到比較耗資源的幾個線程在干什么,方便排查問題。不用dump出堆棧,直接可以看,使用比較輕量級。

查看CPU占用靠前的幾個線程

命令如下:

thread -n 3

結果如下:

Java線上診斷工具Arthas的使用方法

找當前阻塞其它線程的線程

這個命令目前只能支持找出找出synchronized關鍵字阻塞住的線程, 如果是java.util.concurrent.Lock, 目前還不支持。實用性不夠。 命令如下:

thread -b

結果看一下官方給的例子

Java線上診斷工具Arthas的使用方法

logger(可以動態的修改 logger的級別,可以指定 package 的級別)

這個命令也比較實用。

sc sm (sc 查看jvm加載的class,sm 查看jvm加載的類的方法)

官方命令 sc sm sc 查看class類,sm 查找class類的方法列表

[arthas@15658]$ sc *Album
com.zero.secret.dal.dto.Album
Affect(row-cnt:1) cost in 30 ms.


[arthas@15658]$ sm com.zero.secret.dal.dto.Album
com.zero.secret.dal.dto.Album <init>()V
com.zero.secret.dal.dto.Album getTag()Ljava/lang/String;
com.zero.secret.dal.dto.Album getDesc()Ljava/lang/String;
com.zero.secret.dal.dto.Album getStatus()Ljava/lang/Integer;
com.zero.secret.dal.dto.Album setStatus(Ljava/lang/Integer;)V
com.zero.secret.dal.dto.Album getImgs()Ljava/util/List;
com.zero.secret.dal.dto.Album getGirlId()Ljava/lang/Long;
com.zero.secret.dal.dto.Album setDesc(Ljava/lang/String;)V
com.zero.secret.dal.dto.Album setTitle(Ljava/lang/String;)V
com.zero.secret.dal.dto.Album setCreateTime(Ljava/util/Date;)V
com.zero.secret.dal.dto.Album setUpdateTime(Ljava/util/Date;)V
com.zero.secret.dal.dto.Album setGirlId(Ljava/lang/Long;)V

heapdump 打印堆棧

官方命令 heapdump 這個命令很簡單,打印堆棧。

[arthas@15658]$ heapdump /data/dump.hprof
Dumping heap to /data/dump.hprof...
Heap dump file created

getstatic 獲取類的靜態成員變量的值

官方命令文檔:getstatic

獲取類內部靜態成員變量的值。

[arthas@15658]$ getstatic com.zero.secret.web.controller.AlbumController  PAGE_SIZE
field: PAGE_SIZE
@Integer[25]
Affect(row-cnt:1) cost in 8 ms.

jad、mc、redefine (反編譯、編譯、熱部署)

以上命令的官方文檔詳見:jad mc redefine

反編譯AlbumController

[arthas@15658]$ jad com.zero.secret.web.controller.AlbumController

ClassLoader:
+-org.springframework.boot.loader.LaunchedURLClassLoader@5d099f62
  +-sun.misc.Launcher$AppClassLoader@55f96302
    +-sun.misc.Launcher$ExtClassLoader@5dbd8ca1

Location:
file:/data/secret/web/secret-web.jar!/BOOT-INF/classes!/

上面信息很重要,記住當前類的classloader編號 5d099f62。接下來把反編譯的源碼輸出到我們方便編輯的目錄,如下:

jad --source-only com.zero.secret.web.controller.AlbumController > /data/artas/AlbumController.java

編輯 AlbumController.java 源文件,加一行日志:

Java線上診斷工具Arthas的使用方法

將編輯好的源文件AlbumController.java 編譯到目標位置,mc 指定需要加載器,否則容易出現很多依賴找不到的情況。這里是指定原來的類加載器來編譯,且默認的class文件是在原來的class文件位置。后面只需要熱加載即可。

[arthas@15658]$ mc -c 5d099f62  /data/artas/AlbumController.java
Memory compiler output:
/data/secret/web/com/zero/secret/web/controller/AlbumController.class
Affect(row-cnt:1) cost in 5279 ms.

接下來熱加載,同樣,指定原來的類加載器。

[arthas@15658]$ redefine -c 5d099f62  /data/secret/web/com/zero/secret/web/controller/AlbumController.class
redefine success, size: 1

最后看一下執行的結果。 Java線上診斷工具Arthas的使用方法

這樣,不用重新發布應用,就可以測試某些功能是否能解決問題。

關于Java線上診斷工具Arthas的使用方法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

福安市| 阿鲁科尔沁旗| 巨野县| 旺苍县| 昌宁县| 安宁市| 徐州市| 唐山市| 西乡县| 儋州市| 鄄城县| 通江县| 龙游县| 花垣县| 专栏| 吉首市| 固阳县| 乡城县| 尼玛县| 林口县| 邓州市| 马龙县| 吉隆县| 白水县| 凤庆县| 恩施市| 枞阳县| 辉南县| 大兴区| 南郑县| 柳江县| 鄂托克旗| 长武县| 东乡县| 阿克| 四会市| 东丰县| 旬阳县| 凌海市| 米脂县| 密云县|