您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Java線上診斷工具Arthas的使用方法,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識(shí)有一定的了解。
排查一些生產(chǎn)環(huán)境問題,確實(shí)蠻好用的。
當(dāng)你遇到以下類似問題而束手無策時(shí),Arthas可以幫助你解決:
這個(gè)類從哪個(gè) jar 包加載的?為什么會(huì)報(bào)各種類相關(guān)的 Exception?
我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯(cuò)了?
遇到問題無法在線上 debug,難道只能通過加日志再重新發(fā)布嗎?
線上遇到某個(gè)用戶的數(shù)據(jù)處理有問題,但線上同樣無法 debug,線下無法重現(xiàn)!
是否有一個(gè)全局視角來查看系統(tǒng)的運(yùn)行狀況?
有什么辦法可以監(jiān)控到JVM的實(shí)時(shí)運(yùn)行狀態(tài)?
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/
這個(gè)命令用來追蹤方法的執(zhí)行性能,支持按照時(shí)間過濾,更詳細(xì)的參考官方文檔 trace命令
命令:
trace com.zero.secret.web.controller.AlbumController home
效果:
結(jié)果里面,第一列是該方法的耗時(shí),第二列是具體的方法,第三列是 代碼所在的行號(hào)
有時(shí)候方法內(nèi)的方法太多,可以根據(jù)時(shí)間過濾,篩選出超哥某個(gè)時(shí)間的方法。命令如下:
trace com.zero.secret.web.controller.AlbumController home '#cost > 10'
帶上時(shí)間過濾測試的沒有效果,下次再試試。
trace命令只能跟蹤一層,如果想要跟蹤更深層的方法,可以用多方法。
trace -E com.zero.secret.web.controller.AlbumController|com.zero.secret.dal.mapper.AlbumMapper home|selectByPrimaryKey
注意:
trace本身是有耗時(shí)的,這里面顯示的耗時(shí)沒有減去trace本身的耗時(shí)
詳細(xì)的watch命令查看官方文檔。watch命令
命令:
watch com.zero.secret.service.AlbumService getAlbum "{params,returnObj}" -x 2
這里 -x 2 表示參數(shù)深度顯示2層,默認(rèn)只顯示一層。下面是一層的返回結(jié)果,比對看看
這里入?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é)果如下:
這里返回的有兩組值。第一組值是進(jìn)入方法時(shí)的入?yún)⒑头祷刂担诙M是方法執(zhí)行結(jié)束時(shí)的入?yún)⒑头祷刂怠?/p>
詳細(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
效果如下:
該命令的官方文檔 monitor
命令如下:
monitor -c 10 com.zero.secret.web.controller.AlbumController home
上面是10s 統(tǒng)計(jì)一次。
結(jié)果如下:
詳情參考 thread 命令 這個(gè)命令可以查看當(dāng)前CPU資源占用比較靠前的幾個(gè)線程詳情,能直觀的看到比較耗資源的幾個(gè)線程在干什么,方便排查問題。不用dump出堆棧,直接可以看,使用比較輕量級(jí)。
命令如下:
thread -n 3
結(jié)果如下:
這個(gè)命令目前只能支持找出找出synchronized關(guān)鍵字阻塞住的線程, 如果是java.util.concurrent.Lock, 目前還不支持。實(shí)用性不夠。 命令如下:
thread -b
結(jié)果看一下官方給的例子
這個(gè)命令也比較實(shí)用。
官方命令 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 這個(gè)命令很簡單,打印堆棧。
[arthas@15658]$ heapdump /data/dump.hprof Dumping heap to /data/dump.hprof... Heap dump file created
官方命令文檔: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
反編譯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 源文件,加一行日志:
將編輯好的源文件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é)果。
這樣,不用重新發(fā)布應(yīng)用,就可以測試某些功能是否能解決問題。
關(guān)于Java線上診斷工具Arthas的使用方法就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(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)容。