原因是沒有安裝完整的jdk,當然重新安裝jdk應該也是可以的,
另一種方案是,下載一個完整的jdk8,解壓到當前目錄的 jdk8,使用命令 ./jdk8/bin/java -jar arthas-boot.jar 2404
就可以了
啟動:
java -jar arthas-boot.jar [PID]
sc 和 sm
- 通過sc可以查看已加載類的相關信息,比如該類是從哪個jar包加載的,被哪個類加載器加載的,以及是否是接口等等。
- sm查看已加載類的方法詳情。
監控方法:
watch
- 讓你能方便的觀察到指定方法的調用情況。能觀察到的范圍為:返回值、拋出異常、入參,通過編寫 OGNL 表達式進行對應變量的查看。
- watch的使用姿勢比較豐富,可以在四個不同的場景觀察方法的執行。比如方法調用之前、方法調用之后、方法異常之后、方法結束之后。默認觀察的是方法結束之后。
- 如果觀察的是方法結束之后的場景,由於入參可能在執行方法時被改變,所以此時輸出的可能不是真正的入參。因此,要看真正的入參,要看方法調用之前的,也就是加上-b的參數。
- 另外,使用-b參數觀察的話,則觀察不到方法返回的結果以及拋出的異常了。
參數名稱 參數說明 class-pattern 類名表達式匹配 method-pattern 方法名表達式匹配 express 觀察表達式 condition-express 條件表達式 [b] 在方法調用之前觀察 [e] 在方法異常之后觀察 [s] 在方法返回之后觀察 [f] 在方法結束之后(正常返回和異常返回)觀察 [E] 開啟正則表達式匹配,默認為通配符匹配 [x:] 指定輸出結果的屬性遍歷深度,默認為 1 [n:] 只執行n次,默認會不斷輸出,除非用戶按下cltr+c
# 觀察CommonTest的test方法 # 輸出 入參、返回結果、拋出的異常 —— 輸出的內容可以動態調整 # 后面跟着的是 條件表達式,表示耗時超過10ms才輸出 # -n 表示只執行一次,-x表示 入參和返回結果的展開層次為5層 watch *.CommonTest test "{params,returnObj,throwExp}" '#cost>10' -x 5 -n 1 # 耗時大於10ms並且第一個參數等於1才輸出 watch *.CommonTest test "{params,returnObj,throwExp}" '#cost>10 && params[0]==1' -x 5 -n 1 # 第一個參數大於1 並且第二個參數等於hello才輸出 watch *.CommonTest test "{params,returnObj,throwExp}" 'params[0]>1 && params[1]=="hello"' -x 5 -n 1 # 第一個參數小於5或者第二個參數等於"world"就輸出 watch *.CommonTest test "{params,returnObj,throwExp}" 'params[0]<5 || params[1]=="wolrd"' -x 5 -n 1 # 第一個參數的name字段等於world時才輸出。 # 由於在方法執行過程中參數的name屬性可能發生改變,因此加上-b才能觀察到真正的入參 watch -b *.CommonTest test "{params,returnObj,throwExp}" 'params[0].name=="wolrd"' -x 5 -n 1 # 由於同時指定了-s和-b,所以方法被調用一次,就會輸出2次結果(兩個場景分開輸出),分別是方法被調用前,和返回之后 # 注意,這里如果-n只設置成1,那么只會輸出-b對應的輸出,-s對應的輸出由於沒有次數了就無法輸出了 watch *.CommonTest test '{params,returnObj,throwExp}' -x 5 -n 2 -s -b