真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java中Arthas的作用及使用方法

本篇內(nèi)容介紹了“Java中Arthas的作用及使用方法”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)公司專注于葫蘆島網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供葫蘆島營(yíng)銷型網(wǎng)站建設(shè),葫蘆島網(wǎng)站制作、葫蘆島網(wǎng)頁(yè)設(shè)計(jì)、葫蘆島網(wǎng)站官網(wǎng)定制、重慶小程序開發(fā)服務(wù),打造葫蘆島網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供葫蘆島網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

1 簡(jiǎn)介

Arthas 是Alibaba開源的Java診斷工具,深受開發(fā)者喜愛

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

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

  • 我改的代碼為什么沒有執(zhí)行到?難道是我沒 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)?

Arthas支持JDK 6+,支持Linux/Mac/Winodws,采用命令行交互模式,同時(shí)提供豐富的 Tab 自動(dòng)補(bǔ)全功能,進(jìn)一步方便進(jìn)行問(wèn)題的定位和診斷

2 主要功能

Arthas提供的功能主要可以分為以下3個(gè)方面:

  • (1) 信息監(jiān)控

    • 進(jìn)程運(yùn)行基本信息:內(nèi)存、CPU占用、線程信息、線程堆棧、線程數(shù)統(tǒng)計(jì)、環(huán)境變量信息

    • 對(duì)象信息:類對(duì)象靜態(tài)屬性、 Mbean 的屬性信息、已加載類信息、類加載器、類方法信息

  • (2) 方法調(diào)用

    • 方法調(diào)用入?yún)?、返回值查?/p>

    • 方法被調(diào)用的調(diào)用路徑、調(diào)用耗時(shí)、方法調(diào)用次數(shù)、成功次數(shù)、失敗次數(shù)等統(tǒng)計(jì)

    • 記錄和重做方法調(diào)用

  • (3) 類文件處理

    • dump已加載類的字節(jié)碼、字節(jié)碼反編譯、類編譯、類重新熱加載

3 安裝和使用

3.1 安裝

下載arthas-boot.jar,然后用java -jar的方式啟動(dòng):

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

然后輸入進(jìn)程對(duì)應(yīng)編號(hào),進(jìn)入Arthas的命令交互界面即可使用:

Java中Arthas的作用及使用方法

打印幫助信息:

java -jar arthas-boot.jar -h

3.2 使用

下面介紹Arthas的一些常用的命令和用法和原理,看看是如何解決我們實(shí)際中的問(wèn)題的,命令詳情可以參考Arthas的官方文檔

(1) 整體dashboard數(shù)據(jù)

在arthas的命令行界面,輸入dashboard命令,會(huì)實(shí)時(shí)展示當(dāng)前tomcat的多線程狀態(tài)、JVM各區(qū)域、GC情況等信息 Java中Arthas的作用及使用方法

(2) 查看線程監(jiān)控

輸入thread命令,會(huì)顯示所有線程的狀態(tài)信息 輸入thread -n 3會(huì)顯示當(dāng)前最忙的3個(gè)線程,可以用來(lái)排查線程CPU消耗 輸入thread -b 會(huì)顯示當(dāng)前處于BLOCKED狀態(tài)的線程,可以排查線程鎖的問(wèn)題 Java中Arthas的作用及使用方法

(3) JVM監(jiān)控

輸入jvm命令,查看jvm詳細(xì)的性能數(shù)據(jù) Java中Arthas的作用及使用方法

(4) 觀察方法參數(shù)、返回值

有時(shí)排查問(wèn)題中我們需要查看參數(shù),返回值,通常的需要加日志打印,比較繁瑣,基于watch命令我們可以很方便做到這一切

$ watch demo.MathGame primeFactors "{params,returnObj}" -x 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 44 ms.
ts=2018-12-03 19:16:51; [cost=1.280502ms] result=@ArrayList[
    @Object[][
        @Integer[535629513],
    ],
    @ArrayList[
        @Integer[3],
        @Integer[19],
        @Integer[191],
        @Integer[49199],
    ],
]

(5) 觀察方法調(diào)用路徑,耗時(shí)詳情

有時(shí)會(huì)遇到服務(wù)卡頓,想排查到底哪個(gè)步驟耗時(shí)比較久,通常做法是加日志,使用trace命令可以很方便解決這個(gè)問(wèn)題:

$ trace demo.MathGame run
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 42 ms.
`---ts=2018-12-04 00:44:17;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
    `---[10.611029ms] demo.MathGame:run()
        +---[0.05638ms] java.util.Random:nextInt()
        +---[10.036885ms] demo.MathGame:primeFactors()
        `---[0.170316ms] demo.MathGame:print()

4 實(shí)現(xiàn)原理

整體宏觀模塊調(diào)用圖如下: Java中Arthas的作用及使用方法

篇幅原因,下面對(duì)其其中涉及的比較核心的2個(gè)原理進(jìn)行簡(jiǎn)單介紹:

(1) 信息監(jiān)控、類文件處理

JDK提供的JMX(Java Management Extensions Java管理擴(kuò)展,是一個(gè)為應(yīng)用程序植入管理功能的框架),JMX管理管理了一系列MBean對(duì)象,Arthas正是基于這些MBean對(duì)象實(shí)現(xiàn)內(nèi)存、GC、類加載信息、JVM信息監(jiān)控

(2) 方法調(diào)用

從JDK5之后,引入了java.lang.Instrument,程序員通過(guò)修改方法的字節(jié)碼實(shí)現(xiàn)動(dòng)態(tài)修改類代碼。在代理類的方法中的參數(shù)中,就有Instrumentation inst實(shí)例。通過(guò)該實(shí)例,我們可以調(diào)用Instrumentation提供的各種接口。比如調(diào)用inst.getAllLoadedClasses()得到所有已經(jīng)加載過(guò)的類。調(diào)用inst.addTransformer(new SdlTransformer(), true)新增轉(zhuǎn)換器。調(diào)用inst.retransformClasses(Class cls),向JVM發(fā)起重轉(zhuǎn)換請(qǐng)求

Arthas使用ASM生成增強(qiáng)后的類的字節(jié)碼,增強(qiáng)的功能包括方法調(diào)用入?yún)?、返回值查看、方法調(diào)用統(tǒng)計(jì)、方法調(diào)用記錄和重做,再基于JDK提供的Instrumentation接口對(duì)方法進(jìn)行增加和轉(zhuǎn)換

5 實(shí)戰(zhàn)案例

Arthas官方文檔提供了許多用戶案例,下面介紹幾個(gè)比較有意思的案例:

(1) 排查應(yīng)用奇怪日志來(lái)源

案例詳情 服務(wù)應(yīng)用運(yùn)行中有時(shí)會(huì)出現(xiàn)一些奇怪日志,排查定位這些日志的來(lái)源比較麻煩 通過(guò)修改StringBuilder的實(shí)現(xiàn)代碼打印出日志的調(diào)用堆棧信息,編譯生成StringBuilder.clss,再基于Arthas提供的redefine命令修改應(yīng)用中使用的StringBuilder的實(shí)際使用字節(jié)碼

(2) 排查SpringBoot應(yīng)用401/404問(wèn)題

案例詳情 頁(yè)面訪問(wèn)返回401/404,碰到這種問(wèn)題時(shí),通常很頭痛,特別是在線上環(huán)境時(shí) 通過(guò)Arthas提供的trace命令,打印出頁(yè)面訪問(wèn)時(shí)的完整請(qǐng)求樹,定位出具體哪個(gè)Servlet返回404

$ trace javax.servlet.Servlet *
Press Ctrl+C to abort.
Affect(class-cnt:7 , method-cnt:185) cost in 1018 ms.

通過(guò)trace命令,trace對(duì)象是javax.servlet.Filter定位具體哪個(gè)Filter攔截請(qǐng)求定位返回401的問(wèn)題來(lái)源

$ trace javax.servlet.Filter *
Press Ctrl+C to abort.
Affect(class-cnt:13 , method-cnt:75) cost in 278 ms.

(3) 線上代碼熱更新

案例詳情 有時(shí)為了快速驗(yàn)證線上問(wèn)題的修復(fù)方案,或者為了快速測(cè)試,我們需要熱更新代碼 Arthas提供的解決步驟如下

  • 步驟1 jad命令反編譯代碼

  • 步驟2 文本編輯器修改代碼

  • 步驟3 sc命令查找代碼所在類的ClassLoader

  • 步驟4 mc命令指定ClassLoader編譯代碼

  • 步驟5 redefine命令熱更新代碼

“Java中Arthas的作用及使用方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!


當(dāng)前名稱:Java中Arthas的作用及使用方法
文章位置:http://weahome.cn/article/jhjjjj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部