成功解决怎么使用Arthas定位CPU突然飙高的问题

1.Arthas的下载地址

https://alibaba.github.io/arthas/arthas-boot.jar

2.启动Arthas(提前下载放到环境上)

java -jar arthas-boot.jar

3.dashboard 命令查看线程,CPU情况

可以看到发现确实有几个线程CPU占用过高

成功解决怎么使用Arthas定位CPU突然飙高的问题_第1张图片

4.thread命令查看最繁忙的8个线程

thread -n 8

成功解决怎么使用Arthas定位CPU突然飙高的问题_第2张图片 

5.找到问题类,jad命令反编译代码

jad org.geekbang.time.commonmistakes.troubleshootingtools.highcpu.HighCPUApplication

成功解决怎么使用Arthas定位CPU突然飙高的问题_第3张图片

 可以看到,调用路径是 main->task()->doTask(),当 doTask 方法接收到的 int 参数等于某个常量的时候,会进行 1 万次的 MD5 操作,这就是耗费 CPU 的来源。那么,这个魔法值到底是多少呢?

6.watch命令查看入参

这时,我们可以使用 watch 命令来观察方法入参。如下命令,表示需要监控耗时超过 100 毫秒的 doTask 方法的入参,并且输出入参,展开 2 层入参参数:

watch org.geekbang.time.commonmistakes.troubleshootingtools.highcpu.HighCPUApplication doTask '{params}' '#cost>100' -x 2

成功解决怎么使用Arthas定位CPU突然飙高的问题_第4张图片

可以看到,所有耗时较久的 doTask 方法的入参都是 0 

7. ognl 命令查看变量

我们使用 ognl 命令来运行一个表达式,直接查询 User 类的 ADMIN_ID 静态字段来验证是不是这样,得到的结果果然是 0:

[arthas@31126]$ ognl '@org.geekbang.time.commonmistakes.troubleshootingtools.highcpu.User@ADMIN_ID'
@Integer[0]

需要额外说明的是,由于 monitor、trace、watch 等命令是通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此诊断结束要执行 shutdown 来还原类或方法字节码,然后退出 Arthas。

你可能感兴趣的:(开发语言,java)