1 问题描述
在服务器上使用top命令发现一个java 进程CPU占用率拉满。
2 排查过程
2.1 查看java进程的线程占用率
top -H -p 3815080
发现pid为3815448的线程cpu占用率异常高。
2.2 查看线程执行状况
jstack -F 3815080 | grep 3815448 -A 20
定位到具体的类,并且发现执行到第59行,则定位代码:
while (true) {
if (!isConnected) {
try {
init();
TimeUnit.SECONDS.sleep(10);
} catch (Exception e) {
log.error("", e);
throw new RuntimeException(e);
}
}
}
这段代码是用来判断连接是否断开,如果断开则需要重新连接。但是如果连接正常,则会导致死循环,占用CPU。至此定位到问题。
3 代码优化
while (true) {
if (!isConnected) {
try {
init();
TimeUnit.SECONDS.sleep(10);
} catch (Exception e) {
log.error("", e);
throw new RuntimeException(e);
}
}else{
//如果没有连接还保持着,则休眠30s,防止cpu沾满
try {
Thread.sleep(30000L);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}