經常使用命令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