如何调试线上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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容