java之生產(chǎn)故障定位Arthas問題
生產(chǎn)故障定位Arthas
Arthas(阿爾薩斯)能為你做什么?
Arthas 是Alibaba開源的Java診斷工具,深受開發(fā)者喜愛。當(dāng)你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:
- 這個類從哪個 jar 包加載的?為什么會報各種類相關(guān)的 Exception?
- 我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯了?
- 遇到問題無法在線上 debug,難道只能通過加日志再重新發(fā)布嗎?
- 線上遇到某個用戶的數(shù)據(jù)處理有問題,但線上同樣無法 debug,線下無法重現(xiàn)!
- 是否有一個全局視角來查看系統(tǒng)的運行狀況?
- 有什么辦法可以監(jiān)控到JVM的實時運行狀態(tài)?
- 怎么快速定位應(yīng)用的熱點,生成火焰圖?
Arthas支持JDK 6+,支持Linux/Mac/Winodws,采用命令行交互模式,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷。
熟悉C++的同學(xué),應(yīng)該了解GDB調(diào)試工具。Arthas就是java版的GDB工具。
如果想了解學(xué)習(xí),可以按照 這個文檔來 學(xué)習(xí)實踐
當(dāng)然,官網(wǎng) 是最好的。
java診斷工具Arthas(watch命令)方法觀察神器
能方便的觀察到指定方法的調(diào)用情況。能觀察到的范圍為:返回值、拋出異常、入?yún)ⅰ?nbsp;
watch
1、得到要觀察類的類屬性以及值,調(diào)用類方法
2、得到類對象的屬性以及值
3、得到方法調(diào)用前后的入?yún)?、出參?/p>
4、根據(jù)調(diào)用時長,入?yún)⑵ヅ錀l件,異常情況過濾方法調(diào)用情況
參數(shù)說明
watch 的參數(shù)比較多,主要是因為它能在 4 個不同的場景觀察對象。
參數(shù)名稱 | 參數(shù)說明 |
---|---|
class-pattern | 類名表達式匹配 |
method-pattern | 方法名表達式匹配 |
express | 觀察表達式,默認(rèn)值:{params, target, returnObj} |
condition-express | 條件表達式 |
[b] | 在方法調(diào)用之前觀察 |
[e] | 在方法異常之后觀察 |
[s] | 在方法返回之后觀察 |
[f] | 在方法結(jié)束之后(正常返回和異常返回)觀察 |
[E] | 開啟正則表達式匹配,默認(rèn)為通配符匹配 |
[x:] | 指定輸出結(jié)果的屬性遍歷深度,默認(rèn)為 1 |
特別說明:
- watch 命令定義了4個觀察事件點,即 -b 方法調(diào)用前,-e 方法異常后,-s 方法返回后,-f 方法結(jié)束后
- 4個觀察事件點 -b、-e、-s 默認(rèn)關(guān)閉,-f 默認(rèn)打開,當(dāng)指定觀察點被打開后,在相應(yīng)事件點會對觀察表達式進行求值并輸出
- 這里要注意方法入?yún)⒑头椒ǔ鰠⒌膮^(qū)別,有可能在中間被修改導(dǎo)致前后不一致,除了 -b 事件點 params 代表方法入?yún)⑼猓溆嗍录即矸椒ǔ鰠?/li>
- 當(dāng)使用 -b 時,由于觀察事件點是在方法調(diào)用前,此時返回值或異常均不存在
- 在watch命令的結(jié)果里,會打印出location信息。location有三種可能值:AtEnter,AtExit,AtExceptionExit。對應(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ào)用前。此時方法剛封裝好形參,還沒有進入方法執(zhí)行體。
2、同時觀察方法調(diào)用前和方法返回后
watch demo.MathGame primeFactors "{params,target,returnObj}" -x 2 -b -s -n 2
以上命令可以將調(diào)用方法前(-b參數(shù))"{params,target,returnObj}"即入?yún)ⅲ瑃his對象和返回參數(shù)返回。
可以將調(diào)用方法返回后(-s參數(shù))的"{params,target,returnObj}"即入?yún)ⅲ瑃his對象和返回參數(shù)返回。
如果參數(shù)形式為"{params,returnObj}"只返回入?yún)⒑突貐ⅰ?/p>
以上所有結(jié)果均在result中體現(xiàn)。
- 參數(shù)里-n 2,表示只執(zhí)行兩次
- 這里輸出結(jié)果中,第一次輸出的是方法調(diào)用前的觀察表達式的結(jié)果,第二次輸出的是方法返回后的表達式的結(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類的實例中的屬性和值。
4、入?yún)l件表達式
watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0 -b
過濾出來方法調(diào)用前匹配條件為參數(shù)>0的入?yún)⒑蛅his對象,只有滿足條件的調(diào)用才會返回。
5、按照耗時進行過濾
watch demo.MathGame primeFactors '{params, returnObj}' '#cost>2' -x 2
過濾出來時長調(diào)用大于2ms的。
6、觀察異常信息
watch demo.MathGame primeFactors "{params[0],throwExp}" -e -x 2
- -e 表示拋出異常時才觸發(fā)
- express中,表示異常信息的變量是throwExp
7、訪問當(dāng)前對象中的某個屬性
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官方文檔
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于maven依賴 ${xxx.version}報錯問題
這篇文章主要介紹了關(guān)于maven依賴 ${xxx.version}報錯問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01Spring Boot 2.0多數(shù)據(jù)源配置方法實例詳解
這篇文章主要介紹了Spring Boot 2.0多數(shù)據(jù)源配置方法實例詳解,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-09-09Java網(wǎng)絡(luò)編程基礎(chǔ)教程之Socket入門實例
這篇文章主要介紹了Java網(wǎng)絡(luò)編程基礎(chǔ)教程之Socket入門實例,本文講解了創(chuàng)建Socket、Socket發(fā)送數(shù)據(jù)、Socket讀取數(shù)據(jù)、關(guān)閉Socket等內(nèi)容,都是最基礎(chǔ)的知識點,需要的朋友可以參考下2014-09-09詳解SpringMVC @RequestBody接收J(rèn)son對象字符串
這篇文章主要介紹了詳解SpringMVC @RequestBody接收J(rèn)son對象字符串,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01Java實現(xiàn)動態(tài)規(guī)劃背包問題
本文主要介紹使用java實現(xiàn)動態(tài)規(guī)劃的背包問題,詳細(xì)使用圖文和多種案例進行解析,幫助理解該算法2021-06-06SpringBoot3整合 Elasticsearch 8.x 使用Repository構(gòu)
我們構(gòu)建了一個完整的 Spring Boot 3 和 Elasticsearch 8.x 的增刪改查示例應(yīng)用,使用 Spring Data Elasticsearch Repository,我們能夠快速實現(xiàn)對 Elasticsearch 的基本 CRUD 操作,簡化了開發(fā)流程,希望這個示例能夠幫助你理解如何在項目中有效使用 Elasticsearch!2024-11-11Java單例模式利用HashMap實現(xiàn)緩存數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了Java單例模式利用HashMap實現(xiàn)緩存數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04