项目中或多或少遇到死循环的问题,造成CPU过多的占用,服务器性能急剧下。那么,在出现这种问题时,该如何定位到bug代码呢?
用到的工具:
jstack:jdk自带的内置工具,用来查看某个Java进程内的线程堆栈信息。
- 情景模拟
public static void main(String[] args) {
while (true) {
}
}
在服务器里编译运行,
ps:我这里搞了些时间,按流程:javac Test1.java 再 java Test1,然后报错:“找不到或无法加载主类”,如果有出现这种错误,参考这个
https://www.cnblogs.com/wangxiaoha/p/6293340.html
运行前,查看下CPU使用情况
用jps命令查看当前运行的java程序
新开个窗口,运行测试代码
CPU已经飚到99%,死循环代码有效
2、解决方法
(1)找出该进程内最耗费CPU的进程
top -Hp pid
(2) printf “%x\n” PID 将对应线程转为16进制
(3)jstack pid |grep 16进制 -A90 ,查看代码信息,90代表显示多少行
根据提示是Test1文件第12行,定位正确,开始改bug吧!