這篇文章將為大家詳細(xì)講解有關(guān)Java線上診斷工具Arthas的使用方法,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
創(chuàng)新互聯(lián)專(zhuān)注于皇姑企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),商城網(wǎng)站建設(shè)。皇姑網(wǎng)站建設(shè)公司,為皇姑等地區(qū)提供建站服務(wù)。全流程按需定制網(wǎng)站,專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)
排查一些生產(chǎn)環(huán)境問(wèn)題,確實(shí)蠻好用的。
當(dāng)你遇到以下類(lèi)似問(wèn)題而束手無(wú)策時(shí),Arthas可以幫助你解決:
這個(gè)類(lèi)從哪個(gè) jar 包加載的?為什么會(huì)報(bào)各種類(lèi)相關(guān)的 Exception?
我改的代碼為什么沒(méi)有執(zhí)行到?難道是我沒(méi) commit?分支搞錯(cuò)了?
遇到問(wèn)題無(wú)法在線上 debug,難道只能通過(guò)加日志再重新發(fā)布嗎?
線上遇到某個(gè)用戶的數(shù)據(jù)處理有問(wèn)題,但線上同樣無(wú)法 debug,線下無(wú)法重現(xiàn)!
是否有一個(gè)全局視角來(lái)查看系統(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)方式,只能在本地訪問(wèn)。默認(rèn)的ip是 127.0.0.1,這種情況只命令行交互或者用 http://127.0.0.1:8563/ 來(lái)訪問(wèn)。如果想要在別的機(jī)器上通過(guò)網(wǎng)頁(yè)的方式訪問(wèn),可以在啟動(dòng)命令后帶上 --target-ip 本機(jī)ip,這樣就可以在別的機(jī)器(前提是機(jī)器可以互相訪問(wèn),且端口是開(kāi)的)通過(guò)網(wǎng)頁(yè)訪問(wèn)這個(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
最后可以通過(guò)如下方式訪問(wèn),跟在本機(jī)之前敲命令行是一樣的。
http://139...112:8563/
這個(gè)命令用來(lái)追蹤方法的執(zhí)行性能,支持按照時(shí)間過(guò)濾,更詳細(xì)的參考官方文檔 trace命令
命令:
trace com.zero.secret.web.controller.AlbumController home
效果:
結(jié)果里面,第一列是該方法的耗時(shí),第二列是具體的方法,第三列是 代碼所在的行號(hào)
有時(shí)候方法內(nèi)的方法太多,可以根據(jù)時(shí)間過(guò)濾,篩選出超哥某個(gè)時(shí)間的方法。命令如下:
trace com.zero.secret.web.controller.AlbumController home '#cost > 10'
帶上時(shí)間過(guò)濾測(cè)試的沒(méi)有效果,下次再試試。
trace命令只能跟蹤一層,如果想要跟蹤更深層的方法,可以用多方法。
trace -E com.zero.secret.web.controller.AlbumController|com.zero.secret.dal.mapper.AlbumMapper home|selectByPrimaryKey
注意:
trace本身是有耗時(shí)的,這里面顯示的耗時(shí)沒(méi)有減去trace本身的耗時(shí)
詳細(xì)的watch命令查看官方文檔。watch命令
命令:
watch com.zero.secret.service.AlbumService getAlbum "{params,returnObj}" -x 2
這里 -x 2 表示參數(shù)深度顯示2層,默認(rèn)只顯示一層。下面是一層的返回結(jié)果,比對(duì)看看
這里入?yún)⒌闹稻蜎](méi)有顯示出來(lái)。
有時(shí)候要比對(duì) 參數(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)⒑头祷刂?,第二組是方法執(zhí)行結(jié)束時(shí)的入?yún)⒑头祷刂怠?/p>
詳細(xì)stack命令參考官方文檔 stack命令。
在一些復(fù)雜業(yè)務(wù)中,如果不知道某一個(gè)方法的調(diào)用鏈路,可以用這個(gè)命令查看調(diào)用鏈路?;蛘?不同的業(yè)務(wù)場(chǎng)景調(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è)線程在干什么,方便排查問(wèn)題。不用dump出堆棧,直接可以看,使用比較輕量級(jí)。
命令如下:
thread -n 3
結(jié)果如下:
這個(gè)命令目前只能支持找出找出synchronized關(guān)鍵字阻塞住的線程, 如果是java.util.concurrent.Lock, 目前還不支持。實(shí)用性不夠。 命令如下:
thread -b
結(jié)果看一下官方給的例子
這個(gè)命令也比較實(shí)用。
官方命令 sc sm sc 查看class類(lèi),sm 查找class類(lèi)的方法列表
[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è)命令很簡(jiǎn)單,打印堆棧。
[arthas@15658]$ heapdump /data/dump.hprof Dumping heap to /data/dump.hprof... Heap dump file created
官方命令文檔:getstatic
獲取類(lèi)內(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.
以上命令的官方文檔詳見(jiàn):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)前類(lèi)的classloader編號(hào) 5d099f62。接下來(lái)把反編譯的源碼輸出到我們方便編輯的目錄,如下:
jad --source-only com.zero.secret.web.controller.AlbumController > /data/artas/AlbumController.java
編輯 AlbumController.java 源文件,加一行日志:
將編輯好的源文件AlbumController.java 編譯到目標(biāo)位置,mc 指定需要加載器,否則容易出現(xiàn)很多依賴(lài)找不到的情況。這里是指定原來(lái)的類(lèi)加載器來(lái)編譯,且默認(rèn)的class文件是在原來(lái)的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.
接下來(lái)熱加載,同樣,指定原來(lái)的類(lèi)加載器。
[arthas@15658]$ redefine -c 5d099f62 /data/secret/web/com/zero/secret/web/controller/AlbumController.class redefine success, size: 1
最后看一下執(zhí)行的結(jié)果。
這樣,不用重新發(fā)布應(yīng)用,就可以測(cè)試某些功能是否能解決問(wèn)題。
關(guān)于Java線上診斷工具Arthas的使用方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
網(wǎng)站標(biāo)題:Java線上診斷工具Arthas的使用方法
標(biāo)題來(lái)源:http://sd-ha.com/article22/jgiijc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、App開(kāi)發(fā)、網(wǎng)站維護(hù)、面包屑導(dǎo)航、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、微信公眾號(hào)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)