溫馨提示×

溫馨提示×

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

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

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

發(fā)布時(shí)間:2021-09-13 14:10:55 來源:億速云 閱讀:133 作者:柒染 欄目:大數(shù)據(jù)

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

排查一些生產(chǎn)環(huán)境問題,確實(shí)蠻好用的。

功能

當(dāng)你遇到以下類似問題而束手無策時(shí),Arthas可以幫助你解決:

  1. 這個(gè)類從哪個(gè) jar 包加載的?為什么會(huì)報(bào)各種類相關(guān)的 Exception?

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

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

  4. 線上遇到某個(gè)用戶的數(shù)據(jù)處理有問題,但線上同樣無法 debug,線下無法重現(xiàn)!

  5. 是否有一個(gè)全局視角來查看系統(tǒng)的運(yùn)行狀況?

  6. 有什么辦法可以監(jiān)控到JVM的實(shí)時(shí)運(yùn)行狀態(tài)?

使用示例

環(huán)境安裝

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

上面的啟動(dòng)方式,只能在本地訪問。默認(rèn)的ip是 127.0.0.1,這種情況只命令行交互或者用 http://127.0.0.1:8563/ 來訪問。如果想要在別的機(jī)器上通過網(wǎng)頁的方式訪問,可以在啟動(dòng)命令后帶上 --target-ip 本機(jī)ip,這樣就可以在別的機(jī)器(前提是機(jī)器可以互相訪問,且端口是開的)通過網(wǎng)頁訪問這個(gè) 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

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

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

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

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

這個(gè)命令用來追蹤方法的執(zhí)行性能,支持按照時(shí)間過濾,更詳細(xì)的參考官方文檔 trace命令

正常單層跟蹤調(diào)用鏈路

命令:

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

效果:

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

結(jié)果里面,第一列是該方法的耗時(shí),第二列是具體的方法,第三列是 代碼所在的行號(hào)

篩選時(shí)間

有時(shí)候方法內(nèi)的方法太多,可以根據(jù)時(shí)間過濾,篩選出超哥某個(gè)時(shí)間的方法。命令如下:

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

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

深層次跟蹤調(diào)用鏈路

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

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

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

注意:

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

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

詳細(xì)的watch命令查看官方文檔。watch命令

命令:

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

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

這里 -x 2 表示參數(shù)深度顯示2層,默認(rèn)只顯示一層。下面是一層的返回結(jié)果,比對看看

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

這里入?yún)⒌闹稻蜎]有顯示出來。

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

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

結(jié)果如下:

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

這里返回的有兩組值。第一組值是進(jìn)入方法時(shí)的入?yún)⒑头祷刂担诙M是方法執(zhí)行結(jié)束時(shí)的入?yún)⒑头祷刂怠?/p>

stack(查看方法調(diào)用鏈路)

詳細(xì)stack命令參考官方文檔 stack命令。

在一些復(fù)雜業(yè)務(wù)中,如果不知道某一個(gè)方法的調(diào)用鏈路,可以用這個(gè)命令查看調(diào)用鏈路?;蛘?不同的業(yè)務(wù)場景調(diào)用鏈路不一樣時(shí),也可以使用這個(gè)命令確定某個(gè)業(yè)務(wù)數(shù)據(jù)的調(diào)用鏈路。

命令如下:

stack  com.zero.secret.service.AlbumService getAlbum

效果如下:

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

monitor (監(jiān)控某個(gè)方法在一段時(shí)間內(nèi)容的執(zhí)行次數(shù)、成功的次數(shù),失敗的次數(shù),平均耗時(shí))

該命令的官方文檔 monitor

命令如下:

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

上面是10s 統(tǒng)計(jì)一次。

結(jié)果如下:

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

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

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

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

查看CPU占用靠前的幾個(gè)線程

命令如下:

thread -n 3

結(jié)果如下:

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

找當(dāng)前阻塞其它線程的線程

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

thread -b

結(jié)果看一下官方給的例子

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

logger(可以動(dòng)態(tài)的修改 logger的級(jí)別,可以指定 package 的級(jí)別)

這個(gè)命令也比較實(shí)用。

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 這個(gè)命令很簡單,打印堆棧。

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

getstatic 獲取類的靜態(tài)成員變量的值

官方命令文檔:getstatic

獲取類內(nèi)部靜態(tài)成員變量的值。

[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!/

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

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

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

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

將編輯好的源文件AlbumController.java 編譯到目標(biāo)位置,mc 指定需要加載器,否則容易出現(xiàn)很多依賴找不到的情況。這里是指定原來的類加載器來編譯,且默認(rèn)的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

最后看一下執(zhí)行的結(jié)果。 Java線上診斷工具Arthas的使用方法

這樣,不用重新發(fā)布應(yīng)用,就可以測試某些功能是否能解決問題。

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

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI