一、 准备测试应用
- 新建一个 SpringBoot应用,写一段 CPU 使用率高的代码:
@GetMapping("/cpuUsageRate")
public String cpuUsageRate() {
while (true) {
// 这个循环没有实际意义,只是为了占用CPU
for (int i = 0; i < 1_000_000; i++) {
// 计算一个无用的表达式,仅为了消耗CPU周期
Math.sin(Math.sqrt(i));
}
}
}
二、使用Arthas排查问题
-
启动 Arthas:
java -jar arthas-boot.jar
-
查看CPU使用情况
dashboard
-
查看总体线程使用情况
thread
-
查看异常线程的具体信息
thread 28
这样我们基本就定位到了异常代码的具体信息,第 49 行的死循环导致的 CPU 过高。 -
查看使用率最高的几个线程信息
thread -n 3
第一个:
第二个、第三个:
这样我们也能定位到异常代码的具体信息,在代码有多处问题时比较实用。