java之生產(chǎn)故障定位Arthas問題
生產(chǎn)故障定位Arthas
Arthas(阿爾薩斯)能為你做什么?
Arthas 是Alibaba開源的Java診斷工具,深受開發(fā)者喜愛。當(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)?
- 怎么快速定位應(yīng)用的熱點(diǎn),生成火焰圖?
Arthas支持JDK 6+,支持Linux/Mac/Winodws,采用命令行交互模式,同時(shí)提供豐富的 Tab 自動(dòng)補(bǔ)全功能,進(jìn)一步方便進(jìn)行問題的定位和診斷。
熟悉C++的同學(xué),應(yīng)該了解GDB調(diào)試工具。Arthas就是java版的GDB工具。
如果想了解學(xué)習(xí),可以按照 這個(gè)文檔來 學(xué)習(xí)實(shí)踐
當(dāng)然,官網(wǎng) 是最好的。
java診斷工具Arthas(watch命令)方法觀察神器
能方便的觀察到指定方法的調(diào)用情況。能觀察到的范圍為:返回值、拋出異常、入?yún)ⅰ?nbsp;
watch
1、得到要觀察類的類屬性以及值,調(diào)用類方法
2、得到類對(duì)象的屬性以及值
3、得到方法調(diào)用前后的入?yún)?、出參?/p>
4、根據(jù)調(diào)用時(shí)長(zhǎng),入?yún)⑵ヅ錀l件,異常情況過濾方法調(diào)用情況
參數(shù)說明
watch 的參數(shù)比較多,主要是因?yàn)樗茉?4 個(gè)不同的場(chǎng)景觀察對(duì)象。
| 參數(shù)名稱 | 參數(shù)說明 |
|---|---|
| class-pattern | 類名表達(dá)式匹配 |
| method-pattern | 方法名表達(dá)式匹配 |
| express | 觀察表達(dá)式,默認(rèn)值:{params, target, returnObj} |
| condition-express | 條件表達(dá)式 |
| [b] | 在方法調(diào)用之前觀察 |
| [e] | 在方法異常之后觀察 |
| [s] | 在方法返回之后觀察 |
| [f] | 在方法結(jié)束之后(正常返回和異常返回)觀察 |
| [E] | 開啟正則表達(dá)式匹配,默認(rèn)為通配符匹配 |
| [x:] | 指定輸出結(jié)果的屬性遍歷深度,默認(rèn)為 1 |
特別說明:
- watch 命令定義了4個(gè)觀察事件點(diǎn),即 -b 方法調(diào)用前,-e 方法異常后,-s 方法返回后,-f 方法結(jié)束后
- 4個(gè)觀察事件點(diǎn) -b、-e、-s 默認(rèn)關(guān)閉,-f 默認(rèn)打開,當(dāng)指定觀察點(diǎn)被打開后,在相應(yīng)事件點(diǎn)會(huì)對(duì)觀察表達(dá)式進(jìn)行求值并輸出
- 這里要注意方法入?yún)⒑头椒ǔ鰠⒌膮^(qū)別,有可能在中間被修改導(dǎo)致前后不一致,除了 -b 事件點(diǎn) params 代表方法入?yún)⑼猓溆嗍录即矸椒ǔ鰠?/li>
- 當(dāng)使用 -b 時(shí),由于觀察事件點(diǎn)是在方法調(diào)用前,此時(shí)返回值或異常均不存在
- 在watch命令的結(jié)果里,會(huì)打印出location信息。location有三種可能值:AtEnter,AtExit,AtExceptionExit。對(duì)應(yīng)函數(shù)入口,函數(shù)正常return,函數(shù)拋出異常。
1、觀察方法入?yún)?/strong>
watch demo.MathGame primeFactors "{params,returnObj}" -x 2 -b
執(zhí)行結(jié)果如下圖所示

result中的Object數(shù)組為入?yún)ⅲ愋蜑镮nteger值分別為-198028,-134246,-2551等。
-b表示觀察點(diǎn)為方法調(diào)用前。此時(shí)方法剛封裝好形參,還沒有進(jìn)入方法執(zhí)行體。
2、同時(shí)觀察方法調(diào)用前和方法返回后
watch demo.MathGame primeFactors "{params,target,returnObj}" -x 2 -b -s -n 2

以上命令可以將調(diào)用方法前(-b參數(shù))"{params,target,returnObj}"即入?yún)?,this對(duì)象和返回參數(shù)返回。
可以將調(diào)用方法返回后(-s參數(shù))的"{params,target,returnObj}"即入?yún)?,this對(duì)象和返回參數(shù)返回。
如果參數(shù)形式為"{params,returnObj}"只返回入?yún)⒑突貐ⅰ?/p>
以上所有結(jié)果均在result中體現(xiàn)。
- 參數(shù)里-n 2,表示只執(zhí)行兩次
- 這里輸出結(jié)果中,第一次輸出的是方法調(diào)用前的觀察表達(dá)式的結(jié)果,第二次輸出的是方法返回后的表達(dá)式的結(jié)果
- 結(jié)果的輸出順序和事件發(fā)生的先后順序一致,和命令中 -s -b 的順序無關(guān)
3、 調(diào)整-x的值,觀察具體的方法參數(shù)值
watch demo.MathGame primeFactors "{params,target,returnObj}" -x 3 -b -s -n 2

-x表示遍歷深度,可以調(diào)整來打印具體的參數(shù)和結(jié)果內(nèi)容,默認(rèn)值是1。
可以看到MathGame類的實(shí)例中的屬性和值。
4、入?yún)l件表達(dá)式
watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0 -b

過濾出來方法調(diào)用前匹配條件為參數(shù)>0的入?yún)⒑蛅his對(duì)象,只有滿足條件的調(diào)用才會(huì)返回。
5、按照耗時(shí)進(jìn)行過濾
watch demo.MathGame primeFactors '{params, returnObj}' '#cost>2' -x 2

過濾出來時(shí)長(zhǎng)調(diào)用大于2ms的。
6、觀察異常信息
watch demo.MathGame primeFactors "{params[0],throwExp}" -e -x 2

- -e 表示拋出異常時(shí)才觸發(fā)
- express中,表示異常信息的變量是throwExp
7、訪問當(dāng)前對(duì)象中的某個(gè)屬性
watch demo.MathGame primeFactors 'target.illegalArgumentCount'

8、獲取類的靜態(tài)字段、調(diào)用類的靜態(tài)方法
獲取類的靜態(tài)字段

watch demo.MathGame * '{params,@demo.MathGame@random.nextInt(100)}' -v -n 1 -x 2
調(diào)用類的靜態(tài)方法。
參考:arthas官方文檔
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于maven依賴 ${xxx.version}報(bào)錯(cuò)問題
這篇文章主要介紹了關(guān)于maven依賴 ${xxx.version}報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
Spring Boot 2.0多數(shù)據(jù)源配置方法實(shí)例詳解
這篇文章主要介紹了Spring Boot 2.0多數(shù)據(jù)源配置方法實(shí)例詳解,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09
Java網(wǎng)絡(luò)編程基礎(chǔ)教程之Socket入門實(shí)例
這篇文章主要介紹了Java網(wǎng)絡(luò)編程基礎(chǔ)教程之Socket入門實(shí)例,本文講解了創(chuàng)建Socket、Socket發(fā)送數(shù)據(jù)、Socket讀取數(shù)據(jù)、關(guān)閉Socket等內(nèi)容,都是最基礎(chǔ)的知識(shí)點(diǎn),需要的朋友可以參考下2014-09-09
詳解SpringMVC @RequestBody接收J(rèn)son對(duì)象字符串
這篇文章主要介紹了詳解SpringMVC @RequestBody接收J(rèn)son對(duì)象字符串,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01
Java實(shí)現(xiàn)動(dòng)態(tài)規(guī)劃背包問題
本文主要介紹使用java實(shí)現(xiàn)動(dòng)態(tài)規(guī)劃的背包問題,詳細(xì)使用圖文和多種案例進(jìn)行解析,幫助理解該算法2021-06-06
SpringBoot3整合 Elasticsearch 8.x 使用Repository構(gòu)
我們構(gòu)建了一個(gè)完整的 Spring Boot 3 和 Elasticsearch 8.x 的增刪改查示例應(yīng)用,使用 Spring Data Elasticsearch Repository,我們能夠快速實(shí)現(xiàn)對(duì) Elasticsearch 的基本 CRUD 操作,簡(jiǎn)化了開發(fā)流程,希望這個(gè)示例能夠幫助你理解如何在項(xiàng)目中有效使用 Elasticsearch!2024-11-11
Java單例模式利用HashMap實(shí)現(xiàn)緩存數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了Java單例模式利用HashMap實(shí)現(xiàn)緩存數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04

