Arthas - 開源的java診斷工具,很是有用

 

經常使用命令html

help                查看幫助
help COMMAND        查看指定命令的詳細幫助
COMMAND -h          查看指定命令的詳細幫助
double tab          查看支持的全部命令


dashboard               查看線程JVM信息儀表盤

thread                  查看全部線程
thread 51               查看指定線程堆棧
thread -n 5             查看前5個線程堆棧
thread -n -1            查看全部線程堆棧
thread -b               查看阻塞線程
thread -i 2000          在計算CPU使用率時指定採樣間隔(2秒後輸出結果)

jad javax.servlet.Servlet       對jvm已加載的類進行反編譯
>>>
java -jar cfr-0.148.jar /tmp/TestClass.class 能夠反編譯class文件,org.benf:cfr0.148
<<<

mc -c ClassLoaderHash /tmp/Test.java    編譯java文件
<<<
有依賴關係的單個java文件用javac編譯是確定不行的。內存編譯器mc則能夠,但也有可能會個別代碼編譯失敗
<<<

sc javax.servlet.Servlet        查找jvm已加載的類
sc -d javax.servlet.Servlet     查找jvm已加載的類,打印詳細

stack com.TestClass testMethod            查看方法的調用堆棧,從新觸發後打印

trace com.TestClass testMethod            查看方法的子調用方法的耗時

monitor -c 3 com.TestClass testMethod                       監控方法的調用次數,成功率等信息,每隔3秒輸出一次。

classloader                                                 查看類加載器數量,以及每一個加載器加載的類數量

【ognl】                                                 執行表達式
ognl '@java.lang.System@out.println("hello")'            調用靜態方法
ognl '#str=new String("hello"), #str.length()'           這樣都行
ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}'   執行多個表達式,並賦值給臨時變量


【redefine + sc + jad】                                 實現不重啓加載class
redefine                                                加載外部的.class文件,redefine jvm已加載的類
redefine -c ClassLoaderHash /tmp/TestClass.class        將修改後編譯出來的class文件放到指定目錄,並redefine
>>>
其中ClassLoaderHash爲該類的類加載器HashCode,可經過"sc com.TestClass -d"查詢
必須指定ClassLoaderHash,不然修改不生效。redefine後可使用jad反編譯查看修改。
注意:redefine後的原來的類不能恢復,能夠redefine原始的class文件來還原
限制:1. 不容許新增長field/method 2. 修改正在跑的函數,沒有退出不能生效
<<<

【watch】                                                                                 觀察方法的執行,有點像在方法中打斷點debug。用法同tt中的-w,至關於實時的tt
watch 類 方法 觀察表達式 條件表達式                                                       用法
watch com.TestClass testMethod returnObj                                        觀察方法的執行,包括觀察當前對象、傳入參數、返回值、拋出的異常等等
watch com.TestClass testMethod "@java.lang.Thread@currentThread().getName()"              調用靜態方法
watch com.TestClass testMethod target                                                     觀察當前對象
watch com.TestClass testMethod 'new String("hello")'                                      像極了debug模式的表達式
watch com.TestClass testMethod {params[0],returnObj} -e                                   觀察方法執行的第一個入參合和返回值,僅當方法拋出異常時纔打印
>>>
https://github.com/alibaba/arthas/issues/71         表達式用法說明
https://alibaba.github.io/arthas/advice-class.html  表達式變量說明, 如target、params、returnObj等變量
方法重載問題:使用條件表達式(stack,trace等做用於方法的命令也都適用)
1. 指定參數長度 watch com.TestClass testMethod params[0] params.length==2
2. 指定某參數類型 watch com.TestClass testMethod params[0] 'params[1] instanceof String'
<<<


【tt】                                      記錄方法調用的時間片信息
tt -t com.TestClass testMethod              開始記錄
tt -l                                       查看歷史記錄
tt -i ID                                    查看某個時間片信息(含參數值)
tt -i ID -w params[0]                       查看時間片方法的第一個參數的值,-w用法同watch命令
tt -i ID -w params[0].length()              查看時間片方法的第一個參數的值,支持對象訪問
tt -i ID -w {params[0],param[1]}            查看時間片方法的多個參數的值
>>>
spring mvc應用
攔截RequestMappingHandlerAdapter這個調用,獲取到spring context隨心所欲
tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
tt -i invokeHandlerMethodID -w 'target.getApplicationContext().getBean("helloWorldService")'
<<<

 

使用/安裝指南【下載工具】java

https://alibaba.github.io/arthas/arthas-boot.jar
或
https://alibaba.github.io/arthas/install.sh(sh install.sh下載啓動腳本as.sh)
 
【使用條件】
環境須要安裝java
依賴jdk/lib/tools.jar
若是隻有jre,可拷貝jdk的tools.jar到jre/lib/下
as.sh須要telnet命令,若無telnet可以使用arthas-boot.jar方式
 
【啓動工具】
java -jar arthas-boot.jar 或 sh as.sh

第一次啓動會下載arthas-3.1.4-bin.zip到/root/.arthas/lib/3.1.4/arthas下並解壓。
每次啓動會檢測是否有java進程,而後輸入數字選擇須要診斷的進程。(PS:工具檢測進程的原理$JAVA_HOME/bin/jps -l -v)
sh as.sh --repo-mirror aliyun         //若是下載速度比較慢,可使用aliyun的鏡像
sh as.sh --target-ip 192.168.1.9      //指定telnet監聽IP
sh as.sh -h                           //查看更多啓動配置
sh as.sh PID                          //指定進程診斷

linux-8ku8:/opt/arthas # sh as.sh
Arthas script version: 3.1.4
[INFO] JAVA_HOME: /opt/jdk1.8.0_74
[INFO] Process 10528 already using port 3658
[INFO] Process 10528 already using port 8563
Found existing java process, please choose one and hit RETURN.
* [1]: 10528 org.apache.catalina.startup.Bootstrap

【默認自動下載目錄】
linux-8ku8:~/.arthas/lib/3.1.4/arthas # ls -lh
total 22M
-rw-r--r-- 1 root root  11M Jun 22 16:13 arthas-3.1.4-bin.zip
-rw-r--r-- 1 root root 8.2K Sep 25  2019 arthas-agent.jar
-rw-r--r-- 1 root root 109K Sep 25  2019 arthas-boot.jar
-rw-r--r-- 1 root root 394K Sep 25  2019 arthas-client.jar
-rw-r--r-- 1 root root  11M Sep 25  2019 arthas-core.jar
-rw-r--r-- 1 root root 3.7K Sep 25  2019 arthas-demo.jar
-rw-r--r-- 1 root root 2.9K Sep 25  2019 arthas-spy.jar
-rwxr-xr-x 1 root root 7.6K Sep 25  2019 as-service.bat
-rwxr-xr-x 1 root root 3.1K Sep 25  2019 as.bat
-rwxr-xr-x 1 root root  28K Sep 25  2019 as.sh
-rwxr-xr-x 1 root root  635 Sep 25  2019 install-local.sh

【啓動成功】
linux-8ku8:/opt/arthas # sh as.sh
........
  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.
 /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'
........
[arthas@10528]$ help                   //查看幫助;double tab查看支持的全部命令;help COMMAND查看指定命令的詳細幫助
[arthas@10528]$ exit                   //斷開鏈接,工具還在運行。從新執行as.sh可再次進入,或者telnet 127.0.0.1 3658也可再次重連(後者鏈接速度超快)
[arthas@10528]$ shutdown 或 stop       //關閉工具

【離線安裝】
將arthas-3.1.4-bin.zip解壓到/root/.arthas/lib/3.1.4/arthas/目錄下
非root用戶解壓到/home/$USER/.arthas/lib/3.1.4/arthas/目錄下,注意修改文件的用戶屬組
而後啓動便可,不一樣用戶下執行as.sh,會調用各自用戶家目錄下的arthas
只要建立了ARTHAS_HOME目錄,即/home/$USER/.arthas/lib/$USER_VERSION/arthas,啓動as.sh時就不會聯網下載包,以後把包解壓進去便可。

快捷安裝:解壓arthas-3.1.4-bin.zip後執行install-local.sh便可。原理上面的同樣,自動建立ARTHAS_HOME目錄並拷貝包進去。
ARTHAS_HOME目錄也能夠是自定義的路徑,sh as.sh --arthas-home <value> 使用指定的ARTHAS_HOME目錄執行
【Arthas用戶文檔】
https://github.com/alibaba/arthas/blob/master/README_CN.md https://alibaba.github.io/arthas/dashboard
相關文章
相關標籤/搜索