您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Java線上診斷工具Arthas的使用方法,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
排查一些生產環境問題,確實蠻好用的。
當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:
這個類從哪個 jar 包加載的?為什么會報各種類相關的 Exception?
我改的代碼為什么沒有執行到?難道是我沒 commit?分支搞錯了?
遇到問題無法在線上 debug,難道只能通過加日志再重新發布嗎?
線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!
是否有一個全局視角來查看系統的運行狀況?
有什么辦法可以監控到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/
這個命令用來追蹤方法的執行性能,支持按照時間過濾,更詳細的參考官方文檔 trace命令
命令:
trace com.zero.secret.web.controller.AlbumController home
效果:
結果里面,第一列是該方法的耗時,第二列是具體的方法,第三列是 代碼所在的行號
有時候方法內的方法太多,可以根據時間過濾,篩選出超哥某個時間的方法。命令如下:
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
注意:
trace本身是有耗時的,這里面顯示的耗時沒有減去trace本身的耗時
詳細的watch命令查看官方文檔。watch命令
命令:
watch com.zero.secret.service.AlbumService getAlbum "{params,returnObj}" -x 2
這里 -x 2 表示參數深度顯示2層,默認只顯示一層。下面是一層的返回結果,比對看看
這里入參的值就沒有顯示出來。
有時候要比對 參數在進入方法之前跟執行方法之后的值,比較著看 參數的值的變化,可以添加參數 -b -s 。命令如下:
watch com.zero.secret.service.AlbumService getAlbum "{params,returnObj}" -x 2 -b -s
結果如下:
這里返回的有兩組值。第一組值是進入方法時的入參和返回值,第二組是方法執行結束時的入參和返回值。
詳細stack命令參考官方文檔 stack命令。
在一些復雜業務中,如果不知道某一個方法的調用鏈路,可以用這個命令查看調用鏈路。或者 不同的業務場景調用鏈路不一樣時,也可以使用這個命令確定某個業務數據的調用鏈路。
命令如下:
stack com.zero.secret.service.AlbumService getAlbum
效果如下:
該命令的官方文檔 monitor
命令如下:
monitor -c 10 com.zero.secret.web.controller.AlbumController home
上面是10s 統計一次。
結果如下:
詳情參考 thread 命令 這個命令可以查看當前CPU資源占用比較靠前的幾個線程詳情,能直觀的看到比較耗資源的幾個線程在干什么,方便排查問題。不用dump出堆棧,直接可以看,使用比較輕量級。
命令如下:
thread -n 3
結果如下:
這個命令目前只能支持找出找出synchronized關鍵字阻塞住的線程, 如果是java.util.concurrent.Lock, 目前還不支持。實用性不夠。 命令如下:
thread -b
結果看一下官方給的例子
這個命令也比較實用。
官方命令 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 這個命令很簡單,打印堆棧。
[arthas@15658]$ heapdump /data/dump.hprof Dumping heap to /data/dump.hprof... Heap dump file created
官方命令文檔: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
反編譯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 源文件,加一行日志:
將編輯好的源文件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的使用方法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。