一、Arthas簡介
Arthas是Alibaba開源的Java診斷工具,功能很強大,它是通過Agent方式來連線執行的Java程式、主要通過互動式來完成功能。
https://arthas.aliyun.com/doc/stack.html
首先貼出官方文件,自己使用也不多,主要用於一次線上問題排查
二、執行
java -jar arthas-boot.jar ,執行Arthas
選擇要粘附的程式,輸入編號即可
使用以下兩個命令其中一個檢視java程式的程式號
ps -ef
jps
備註:也可以通過瀏覽器連線Arthas,只是執行命令的時候需要加--target-ip引數
三、dashboard
輸入以下命令進入儀表盤,監控執行緒,記憶體狀態,GC等資訊
四、thread
列印全部執行緒:thread
列印最忙的前10條執行緒: thread -n 10
根據執行緒號列印: thread 20
找出阻塞其他執行緒的執行緒 注意, 目前只支援找出synchronized關鍵字阻塞住的執行緒, 如果是java.util.concurrent.Lock, 目前還不支援。
thread -b
如果響應慢,阻塞狀態的執行緒比較多,我們需要重點關注
五、檢視已經載入的類(如果沒有程式碼許可權,使用jad)
sc com.XXX.sgw.controller.*
sc com.XXX.controller.AccessLogController
六、追蹤方法堆疊呼叫時間
跟蹤方法內部呼叫,輸出各個節點的耗時,主要用於響應慢的時候
trace comXXX.controller.api.ServiceGatewayV1Controller list
trace com.XXX.service.ServiceGatewayV1Service customizeQuery m -n 2 ,一般需要輸出多次結果,所以這裡可以通過-n指定結果數量
七、檢視程式呼叫出入參
類似於debug,檢視被測方法的引數和返回值
watch com.XXX.controller.api.ServiceGatewayV1Controller list "{params[0],params[1],returnObj}"
watch com.XXX.service.ServiceGatewayV1Service customizeQuery "{params[0],params[1],params[2],returnObj}"
八、回溯方法執行
下面關注:耗時、IS-RET為false表示失敗
tt -t com.XXX.vo.PageVo getPageSize
tt -i 1037 -w "target.getPageSize()"
九、檢視方法被呼叫路徑
stack com.XXX.service.impl.PostgresqlServiceImpl customQuery
十、反編譯線上程式碼
jad --source-only com.yingzi.data.sgw.controller.api.ServiceGatewayV1Controller
jad --source-only com.yingzi.data.sgw.controller.api.ServiceGatewayV1Controller getDataByAlgorithm
十一、以3秒為一個時間視窗,統計時間視窗內呼叫次數,成功次數,失敗次數,平時RT時間。用於監控方法的執行情況
monitor -c 3 com.yingzi.data.sgw.controller.api.ServiceGatewayV1Controller list
十二、JVM
重點關注下死鎖(DEADLOCK-COUNT,下面不為0,表示有死鎖)
根據下面的棧資訊,可以看到,這兩個執行緒互相請求被對方佔用未釋放的資源導致了死鎖。舉個例子,現實中很少
十三、profiler(火焰圖)
系統cpu高的時候,我們可以看系統呼叫,相比於perf命令,profiler的步驟要更簡便點,
profiler start,啟動,預設是生成cpu的火焰圖,which event to trace (cpu, alloc, lock, cache-misses etc.), default value is cpu
profiler stop,停止,可以看到生成的svg檔案路徑