当前位置: 首页 > 图灵资讯 > java面试题> 金三银四精选java面试题-如果生产环境出现了CPU飙高问题如何定位解决?

金三银四精选java面试题-如果生产环境出现了CPU飙高问题如何定位解决?

来源:图灵教育
时间:2024-01-08 13:04:30
 

如果生产环境出现了CPU飙高问题如何定位解决?

Arthas 是阿里开源的 Java 诊断工具,相比 JDK 内置的诊断工具,要更人性化,并且功能强大,可以实现许多问题的一键定位,而且可以一键反编译类查看源码,甚至是直接进行生产代码热修复,实现在一个工具内快速定位和修复问题的一站式服务。

Arthas 官方文档: alibaba.Github.io/arthas/

启动 Arthas

首先,下载 Arthas: arthas.aliyun.com/arthas-boot…

然后把程序先运行起来,再运行 arthas:java -jar arthas-boot.jar

启动后,直接找到我们要排查的 JVM 进程,然后可以看到 Arthas 附加进程成功:

输入 help 命令,可以看到所有支持的命令列表。这里主要会用到 dashboard、thread、jad、watch 等命令,来定位高CPU的问题。

dashboard — 展示整体情况

dashboard 命令整体展示了进程所有线程、内存、GC 等情况,可以明显看到两个CPU占用很高的线程,从线程名字来看应该是线程池的线程。


thread — 查看高CPU的线程

接下来,查看最繁忙的线程在执行的线程栈,可以使用 thread -n 命令。这里,我们查看下最忙的 2 个线程:从线程栈可以看出,应该就是 CpuService 的 randomEncode 方法调用 BCryptPasswordEncoder 的 encode 方法导致CPU负载高的。


watch — 监控参数

如果想要观察方法的入参和出参,可以用 watch 命令来观察:

jad — 反编译

redefine — 重载类

如果我们想做线上调试,又不想在本地改代码,打印日志,再提交到服务器,再重启服务测试,那我们可以结合 arthas 的 jad、mc、redefine 来动态重定义类。

1、首先用 jad 把源文件下载下来

然后修改下源码:添加了一行输出日志

2、使用 mc 命令反编译源文件

反编译后会生成对应的 class 文件:

3、使用 redefine 重载类

就可以看到控制台已经在输出我们打印的日志了:

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