Arthas從入門到實踐
Arthas是什么?
在此借用官方的一段話:
當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:
這個類從哪個 jar 包加載的?為什么會報各種類相關的 Exception?
我改的代碼為什么沒有執行到?難道是我沒 commit?分支搞錯了?
遇到問題無法在線上 debug,難道只能通過加日志再重新發布嗎?
線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!
是否有一個全局視角來查看系統的運行狀況?
有什么辦法可以監控到JVM的實時運行狀態?
Arthas支持JDK 6+,采用命令行交互模式,同時提供豐富的?Tab?自動補全功能,進一步方便進行問題的定位和診斷。
接下來,話不多說,開始動手實操了
安裝
-:maven-central v3.0.5
https://img.shields.io/maven-central/v/com.taobao.arthas/arthas-packaging.svg?style=flat-square
解壓后目錄如下:
在此我們著重關注?arthas-boot.jar這個文件,我們可以使用它來啟動?Arthas
可以直接使用 以下 命令
wget?https://alibaba.github.io/arthas/arthas-boot.jar
如果從 github 下載速度比較慢的話推薦 使用 碼云的 鏡像:
wget?https://arthas.gitee.io/arthas-boot.jar
除了以上安裝方式,還有兩種安裝方式:
使用 as.sh 的方式
全量安裝方式
具體安裝方式請參考官網,此處不再贅述。
快速使用
先啟動官方提供的測試 demo
java?-jar?arthas-demo.jar
直接使用以下命令進行啟動:
java?-jar?arthas-boot.jar
注意:在 windows 平臺下,直接啟動會報找不到 tools.jar 的錯,從源碼來看是因為此處尋找 tools.jar 沒有從本地配置的 JAVA_HOME 去獲取,而是先去獲取的 JVM 的 tools.jar, 因此需要我們手動指定以下 JAVA_HOME 的目錄,不知道這個算是 bug ,還是有意為之,期待官方以后的解決方案。
所以 windows 平臺下的命令變成了
java?-Djava.home="D:\jdk\jre"?-jar?arthas-boot.jar
-Djava.home?用于指定本地 JAVA_HOME 目錄
常用命令介紹
dashboard展示當前進程的信息,按ctrl+c?中斷執行
12?????AsyncAppender-Work?system????????5?????WAITIN?0?????0:0????false?true5??????Attach?Listener????system????????5?????RUNNAB?0?????0:0????false?true3??????Finalizer??????????system????????8?????WAITIN?0?????0:0????false?true2??????Reference?Handler??system????????10????WAITIN?0?????0:0????false?true4??????Signal?Dispatcher??system????????9?????RUNNAB?0?????0:0????false?true21?????Timer-for-arthas-d?system????????10????RUNNAB?0?????0:0????false?true20?????as-command-execute?system????????10????TIMED_?0?????0:0????false?true14?????job-timeout????????system????????5?????TIMED_?0?????0:0????false?true1??????main???????????????main??????????5?????TIMED_?0?????0:34???false?false15?????nioEventLoopGroup-?system????????10????RUNNAB?0?????0:0????false?falseMemory???????????used??total?max??usage?GC heap?????????????31M???243M???????0.86%?????????????????????2 ps_eden_space????15M???63M????????1.17%?gc.ps_scavenge.time?14 ?????????????????10M???10M???10M????????(ms) ps_old_gen???????5M????169M???????0.18%?gc.ps_marksweep.cou?0 nonheap??????????21M???21M???-1?????????nt Runtime os.name?????????????Windows?10 os.version??????????10.0 java.version????????1.8.0_144 java.home???????????D:\jre systemload.average??-1.00 ID?????NAME???????????????GROUP?????????PRIOR?STATE??%CPU??TIME???INTER?DAEMON
jad使用該命令 反編譯 class 文件
$?jad?demo.MathGame jad?demo.MathGame ClassLoader: +-sun.misc.Launcher$AppClassLoader@55f96302 ??+-sun.misc.Launcher$ExtClassLoader@74a14482 Location: /E:/study/tools-study/Arthas/arthas-packaging-3.0.5-bin/arthas-demo.jar /* ?*?Decompiled?with?CFR?0_132.?*/ package?demo;import?java.io.PrintStream;import?java.util.ArrayList;import?java.util.Iterator;import?java.util.List;import?java.util.Random;import?java.util.concurrent.TimeUnit;public?class?MathGame?{ ????private?static?Random?random?=?new?Random(); ????private?int?illegalArgumentCount?=?0; ????public?static?void?main(String[]?args)?throws?InterruptedException?{ ????????MathGame?game?=?new?MathGame();????????do?{????????????game.run(); ????????????TimeUnit.SECONDS.sleep(1L); ????????}?while?(true); ????} ...?...
thread -n -1 | grep 'main('
$?thread?-n?-1?|?grep?'main('thread?-n?-1?|?grep?'main(' ????at?demo.MathGame.main(MathGame.java:17)
方法執行數據觀測,這個命令可以方便的觀察到指定方法的調用情況。能觀察到的范圍為:返回值、拋出異常、入參,通過編寫 OGNL 表達式進行對應變量的查看
詳細參數說明請參考 官方文檔:?https://alibaba.github.io/arthas/watch.html
watch 的參數比較多,主要是因為它能在 4 個不同的場景觀察對象
這里重點要說明的是觀察表達式,觀察表達式的構成主要由 ?ognl 表達式組成,所以你可以這樣寫"{params,returnObj}",只要是一個合法的 ognl 表達式,都能被正常支持。
$?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], ????], ]
$?watch?demo.MathGame?primeFactors?"{params,returnObj}"?-x?2?-b Press?Ctrl+C?to?abort. Affect(class-cnt:1?,?method-cnt:1)?cost?in?50?ms. ts=2018-12-03?19:23:23;?[cost=0.0353ms]?result=@ArrayList[ ????@Object[][ ????????@Integer[-1077465243], ????], ????null, ]
$?watch?demo.MathGame?primeFactors?"{params[0],throwExp}"?-e?-x?2 Press?Ctrl+C?to?abort. Affect(class-cnt:1?,?method-cnt:1)?cost?in?62?ms. ts=2018-12-03?19:38:00;?[cost=1.414993ms]?result=@ArrayList[ ????@Integer[-1120397038], ????java.lang.IllegalArgumentException:?number?is:?-1120397038,?need?>=?2 ????at?demo.MathGame.primeFactors(MathGame.java:46) ????at?demo.MathGame.run(MathGame.java:24) ????at?demo.MathGame.main(MathGame.java:16) , ]
$?watch?demo.MathGame?primeFactors?'{params,?returnObj}'?'#cost>200'?-x?2 Press?Ctrl+C?to?abort. Affect(class-cnt:1?,?method-cnt:1)?cost?in?66?ms. ts=2018-12-03?19:40:28;?[cost=2112.168897ms]?result=@ArrayList[ ????@Object[][ ????????@Integer[2141897465], ????], ????@ArrayList[ ????????@Integer[5], ????????@Integer[428379493], ????], ]
退出arthas
如果只是退出當前的連接,可以用quit或者exit命令。Attach到目標進程上的arthas還會繼續運行,端口會保持開放,下次連接時可以直接連接上。
如果想完全退出arthas,可以執行shutdown命令。
Java JAR
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。