造错误代码如下:
人造死循环,用来模拟cpu异常的情况
打包发布并启动
打包发布到linux机器中,启动jar包。
java -jar ***.jar --server.port=9093
请求,造异常
- 正常请求无错误
curl localhost:9093/test
- 请求会导致异常的代码
curl localhost:9093/test/jvmtest
- 使用
top
命令,查看cpu占用情况
可以看到pid尾24933的进程cpu占用了100%,这就是我们造出来模拟的异常。 - 查看线程中耗新能的子线程
top -Hp 24933
可以看到线程号为25013的线程占用99.9的cpu。 - 将线程号转换为25013
方式一:通过你手头的计算机算出来16进制值
方式二:使用printf
命令转换
printf "%x" 25013
,巧妙的用%x
,占位符将10进制的值转换为了16进制 - 使用
jstack
查询出错误的代码位置
jstack 24933 | grep 61b5 -A 30
其中24933
为进程号,61b5
为上一步中算出来的16进制的线程号。
命令查询的结果如下:
可以看到线程状态时
RUNNABLE
,且具体的代码位置为:TestController
第93行。再回看下代码。确实如此,终于找出问题。