通过Arthas排查Java程序CPU占用过高问题
需要工具包:arthas-packaging-3.2.0-bin.zip
模拟问题
使用如下代码制造一个CPU占用100%的情况
/**
* 制造一个死循环,实现cpu100%
*/
@RequestMapping("/lock")
public void lock(){
System.out.println("开始死锁操作。。。。");
StringBuffer stringBuffer = new StringBuffer();
while(true){
String uuid = UUID.randomUUID().toString();
}
}
这是一个SpringBoot的应用,通过使用命令curl http://xxx:xxx/lock
,即可触发
排查步骤
-
上传arthas-packaging-3.2.0-bin.zip到服务器,创建目录
arthas
并将zip
包拷贝到该目录下,解压 -
使用
top
命令,查看当前CPU的情况,记录下占用率最高的进程pid
-
下记录下cpu占用过高的pid(本例中是2864)
-
执行
java -jar arthas-boot.jar
- 输入
1
(序号),根据实际情况选择对应的序号,会进入arthas命令行的执行程序中
-
输入
thread -n 3
会列举出当前三个占用CPU最高的线程,根据图中可以定位到具体的业务代码行数
- 除此之外,也可以使用
dashboard
命令查看当前的Java程序运行情况