诊断监控工具Arthas

370 阅读1分钟

常见使用

热修改代码

wget https://github.com/hengyunabc/katacoda-scenarios/raw/master/demo-arthas-spring-boot.jar

#可以不后台运行,但是注意有可能需要sudo权限,不然网络权限不足
sudo java -jar demo-arthas-spring-boot.jar &

#进入arthas之后选择spring-boot
#jad --> mc --> redefine 三部曲, 第一个反编译Java文件,第二个修改后生产class,第三加载

#1.反编译输出jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java
#2.搜索到对应类的classloadersc -d *UserController |grep classLoader
#3.修改后编译,传入正确的code,不可省mc -c classLoader /tmp/UserController.java -d /tmp
#4.重新热加载(无需重启服务),并且非侵入, 只是临时修改.redefine /tmp/com/example/demo/arthas/user/UserController.class

有的时候可能反编译失败,那就只能手动上传了

定位报错

#1. watch确认为空的类,假设我修改了A类.但是不知道是哪个方法
# 一般观察方法的入参值,返回值,抛出异常三个常用参数就行了
watch xx.xx.A * '{params,returnObj,throwExp}' -x 2 
#展开2层异常栈, 更具体常用3层. 你会发现打印的信息相当详细
#2. 一般watch就能秒杀500报错这种问题了,trace能帮我们把时间消耗用树形输出, 就会更清晰,而且会告诉你哪抛出了异常.
trace xx.xx.A * -j #不输出JDK方法,当然你可以不用*, 而是通过watch之后更小的范围.


方法执行监控

monitor -c 5 demo.MathGame primeFactors

-c 统计周期 默认120s

活用 ognl 表达式

假设某方法单位时间内的调用次数在增加,可以使用ognl查看变量的值(如set、list的值)



详情见 alibaba.github.io/arthas/inde…