Java进程死循环,CPU 100%怎么排查? 2021-12-29 15:56:00 编程 Linux, Java 暂无评论 641 次阅读 1150字 修改时间:2021-12-29 16:00:31 Java程序出现bug陷入死循环,Linux服务器Cpu飙升到100%,如何才能快速定位到Java程序的某一行? 其实Java虚拟机自带了堆栈跟踪工具 -- jstack,我们可以利用他很好的排查 ------------ 为了制造陷入死循环的bug,先准备一个api,只要请求/test?count={} 就能拉高cpu ```java @RequestMapping("/test") public long test(long count){ long number = 0; for (int i = 0; i < count; i++) { number++; } return number; } ``` 部署到服务器之后,我们直接执行 `http://xxxx:8080/test?count=10000000000000` ## 第一步:使用top命令 使用top命令查看一下,发现java进程占了很高的cpu,记住进程的PID为 `1147 `  ## 第二步:使用top -Hp 命令查看 pid的线程状态 ```bash top -Hp 1147 ``` 图中,发现PID `4151` 这个线程占据了绝大部分CPU,说明问题就出在这个线程上  ## 第三步:使用jstack查看堆栈信息 首先,需要先将线程PID`4151`转换为16进制,得到 `1037` ```bash # printf '%x\n' 4151 1037 ``` 使用jstack 命令查询 `1147` 这个进程,并过滤出线程为1037(十六进制)的数据,-A 代表显示10行记录 ```bash jstack 1147 | grep 1037 -A 10 ```  结果显示,此线程在**CputopApplication**这个类中第21行,查看代码,发现第21正是for循环出的幺蛾子  问题不大 破案 撒花 标签: Linux, Java
评论已关闭