编写测试类
@RestController
public class TestController {
@RequestMapping("/jvm_top")
public void jvmTop(){
while (true) {
System.out.println(new java.util.Random().nextInt(777778888));
}
}
@RequestMapping("/hello")
public String hello(){
return "hello world";
}
}
打包成jar包,然后上传到linux
java -jar xxx.jar
测试一下访问
可以看到正常访问
接着我们查看linux的核数,输入下条命令
cat /proc/cpuinfo
可以看到linux核数是2核。
接着,我们访问模拟死循环的接口。
再使用 top 命令,查看进程运行情况
top
接着按住 shift + h , 对占用资源较高的进程升序。为什么没有出现CPU占用100%呢?可能是我的CPU性能太好的因素。
由该图可以看到
- 1)平均负载(load average):1.36.说明平均负载过高(超过0.6) ,后台一定有个占用cpu过高的程序。
- 2)该程序为一个java程序占用CPU百分比为22.6,内存为0.6%,该java进程ID为2660
或者使用jps查看后后台应用程序
jps -l
定位具体的线程ID
ps -mp 进程ID -o THREAD,tid,time
定位具体的应用程序代码位置
(1)将需要的线程ID转换成16进制格式
1) printf “%x\n” 有问题的线程ID
printf "%x\n" 11912
该pid是 top命令查看的线程id
接着,我们使用jstack命令查看 错误信息
jstack 11911 | grep 2e88 -A60
这样就定位到错误代码了。
当然也可以将dump转换成文件查看,该命令是
jstack pid > p.txt