當(dāng)你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:
這個類從哪個 jar 包加載的?為什么會報各種類相關(guān)的 Exception?
安裝
curl -O https://arthas.aliyun.com/arthas-boot.jar

image.png
輸入編號進(jìn)入指定項(xiàng)目, 如13
反編譯
jad com.xxxx.web.manager.boot.PartnerWebManagerApplication

image.png
查看方法入?yún)?,返回?/h2>
watch com.xxx.web.manager.controller.ad.config.AdConfigController list returnObj
image.png
查看返回值屬性遍歷深度
watch com.xxx.web.manager.controller.ad.config.AdConfigController list returnObj -x 3
image.png
同時觀察入?yún)⒑统鰠?/h2>
watch com.xxx.web.manager.controller.ad.config.AdConfigController list {params,returnObj} -x 3
image.png
可以使用ongl條件表達(dá)式過濾指定的請求
watch com.xxx.web.manager.controller.ad.config.AdConfigController list "{params[0],target}" "params[0]<0"
獲取第一個參數(shù),并且條件滿足后面的條件
watch com.xxx.web.manager.controller.ad.config.AdConfigController list "{params[0],target}"
'{params, returnObj}' '#cost>200'
只查看耗時大于200ms的請求
image.png
watch com.xxx.web.manager.controller.ad.config.AdConfigController list returnObj

image.png
watch com.xxx.web.manager.controller.ad.config.AdConfigController list returnObj -x 3

image.png
watch com.xxx.web.manager.controller.ad.config.AdConfigController list {params,returnObj} -x 3

image.png
可以使用ongl條件表達(dá)式過濾指定的請求
watch com.xxx.web.manager.controller.ad.config.AdConfigController list "{params[0],target}" "params[0]<0"
獲取第一個參數(shù),并且條件滿足后面的條件
watch com.xxx.web.manager.controller.ad.config.AdConfigController list "{params[0],target}"
'{params, returnObj}' '#cost>200'
只查看耗時大于200ms的請求

image.png
觀察表達(dá)式和條件表達(dá)式可以使用ognl表達(dá)式
查看方法調(diào)用路徑及響應(yīng)時間
trace com.xxx.web.manager.controller.ad.config.AdConfigController list

image.png
方法被調(diào)用路徑
stack com.xxx.service.basic.ad.config.service.impl.AdConfigServiceImpl pageList
記錄下指定方法每次調(diào)用的入?yún)⒑头祷匦畔?/h2>
tt -t com.xxx.service.basic.ad.config.service.impl.AdConfigServiceImpl pageList
image.png
查看保存的方法調(diào)用列表
tt -l
根據(jù)條件搜索
tt -s 'method.name=="pageList"'
查看某一次調(diào)用的信息
tt -i 1003 -x3
image.png
不重啟服務(wù)器,動態(tài)修改代碼(添加日志)
tt -t com.xxx.service.basic.ad.config.service.impl.AdConfigServiceImpl pageList

image.png
tt -l
根據(jù)條件搜索
tt -s 'method.name=="pageList"'
tt -i 1003 -x3

image.png
java的方法存在方法區(qū)內(nèi),方法區(qū)里面的數(shù)據(jù)是類加載時從class文件中提取出來的,所以我們可以直接修改class文件并替換,達(dá)到熱更新的目的
修改代碼,編譯成class文件

image.png
將class 文件上傳到服務(wù)器某個目錄下面,然后執(zhí)行 retransform命令

image.png
再次調(diào)用修改后的接口,就會打印出新加的日志

image.png
查看類是從那個jar包執(zhí)行
使用sc -d 命令

image.png