程序死循环、死锁问题定位
在开发过程中,可能由于代码设计问题导致出现了死循环或者死锁的问题,使服务器CPU负载飙高从而导致系统运行缓慢,因此要特别注意防止死循环和死锁的发生。如监控服务器状态时,如果发现CPU负载或利用率飙得很高,这时候就要定位出可能出现的问题,这是在开发中非常重要的能力之一。
主要方法:top 、jstack
定位死循环
-
模拟一段死循环代码(我这里参考了其他博客的代码来做实验–链接)
-
打jar包上传到Linux服务端(usr/local/jar)
mvn clean package -Dmaven.test.skip
- 运行jar包
nohup java -jar monitor_tuning-0.0.1-SNAPSHOT.jar &
- 访问死循环方法对应的url地址执行死循环代码,top查看运行的jar的进程ID
可以看到负载和cpu利用率都飙得很高
- 问题排查,实验jstack获取对应进程的线程堆栈信息,下载到本地查看
jstack 108196 >108196.txt
rz 108196.txt
top -p 108196 -H
查看进程中cpu利用率最高的线程ID记录下来在jstack导出的文件中查看对应信息
- 使用
printf "%x" 108262
转化为16进制然后在jstack导出的文件中查找对应线程ID的信息