编写测试类

  1. @RestController
  2. public class TestController {
  3. @RequestMapping("/jvm_top")
  4. public void jvmTop(){
  5. while (true) {
  6. System.out.println(new java.util.Random().nextInt(777778888));
  7. }
  8. }
  9. @RequestMapping("/hello")
  10. public String hello(){
  11. return "hello world";
  12. }
  13. }

打包成jar包,然后上传到linux

  1. java -jar xxx.jar

测试一下访问
image.png
可以看到正常访问
接着我们查看linux的核数,输入下条命令

  1. cat /proc/cpuinfo

image.png
可以看到linux核数是2核。
接着,我们访问模拟死循环的接口。
image.png
再使用 top 命令,查看进程运行情况

  1. top

接着按住 shift + h , 对占用资源较高的进程升序。为什么没有出现CPU占用100%呢?可能是我的CPU性能太好的因素。
image.png
由该图可以看到

  • 1)平均负载(load average):1.36.说明平均负载过高(超过0.6) ,后台一定有个占用cpu过高的程序。
  • 2)该程序为一个java程序占用CPU百分比为22.6,内存为0.6%,该java进程ID为2660

或者使用jps查看后后台应用程序

  1. jps -l

image.png
可以看到我们已经运行了三个jar包。

定位具体的线程ID

  1. ps -mp 进程ID -o THREAD,tid,time

image.png

定位具体的应用程序代码位置

解释:定位线程中具体哪一行代码出问题

(1)将需要的线程ID转换成16进制格式

1) printf “%x\n” 有问题的线程ID

  1. printf "%x\n" 11912

该pid是 top命令查看的线程id
image.png
接着,我们使用jstack命令查看 错误信息

  1. jstack 11911 | grep 2e88 -A60

image.png
这样就定位到错误代码了。
当然也可以将dump转换成文件查看,该命令是

  1. jstack pid > p.txt