以一个例子来演示服务器CPU占用率过高的问题:
代码:
@RestController
@RequestMapping(path = "/index")
public class IndexController {
@RequestMapping(value = "/param")
public String param(){
int i = 0;
while (true) {
i++;
System.out.println(i);
}
}
}
项目部署到虚拟机,启动项目,访问:http://172.16.150.128:8080/index/param,top命令查询pid为6856的进程CPU的占用率达到99.9%,
接着使用top -Hp pid命令查看进程对应的线程占用情况:top -Hp 6856
发现线程ID为6882的线程CPU占用率达到98.6%,于是将6882转换为16进制,得到1ae2:
[root@localhost webapps]# printf "%x \n" 6882
1ae2
接着使用:jstack -l 6856 | grep 1ae2 -A 20 查看线程运行状态 (6856是进程号)
于是定位到83行代码。
参考博客:使用jstack命令排查线上问题
解压缩:
然后直接将hprof文件用idea打开: