如何调试线上cpu高占的问题

造错误代码如下:

人造死循环,用来模拟cpu异常的情况


image.png

打包发布并启动

打包发布到linux机器中,启动jar包。
java -jar ***.jar --server.port=9093

请求,造异常

  1. 正常请求无错误
    curl localhost:9093/test
  2. 请求会导致异常的代码
    curl localhost:9093/test/jvmtest
  3. 使用top命令,查看cpu占用情况
    image.png

    可以看到pid尾24933的进程cpu占用了100%,这就是我们造出来模拟的异常。
  4. 查看线程中耗新能的子线程
    top -Hp 24933
    image.png

    可以看到线程号为25013的线程占用99.9的cpu。
  5. 将线程号转换为25013
    方式一:通过你手头的计算机算出来16进制值
    image.png

    方式二:使用printf命令转换
    printf "%x" 25013,巧妙的用%x,占位符将10进制的值转换为了16进制
  6. 使用jstack查询出错误的代码位置
    jstack 24933 | grep 61b5 -A 30
    其中24933为进程号,61b5为上一步中算出来的16进制的线程号。

命令查询的结果如下:

image.png

可以看到线程状态时RUNNABLE,且具体的代码位置为:TestController第93行。
再回看下代码。确实如此,终于找出问题。
image.png

推荐阅读更多精彩内容