在博客中,我们通过jstack分析cpu占用高应用,发现flume占用过高,通过分析代码,发现了一个死循环,这里给大家看看两个代码的差别:
old:
//读到空行
if(line==null||line.trim().length()<1){
while (true){
logger.info(this.filepath+"=randomAccessFile.readLine=> line is null");
filePointer = randomAccessFile.getFilePointer();
line=randomAccessFile.readLine();
if ((line!=null && line.trim().length()>0) || fileLength <= filePointer) {
break;
}
}
}
new:
//读到空行
if(line==null||line.trim().length()<1){
int io_c = 0;
while (true){
io_c=io_c+1;
logger.info(this.filepath+"=randomAccessFile.readLine=> line is null");
filePointer = randomAccessFile.getFilePointer();
line=randomAccessFile.readLine();
if ((line!=null && line.trim().length()>0) || fileLength <= filePointer) {
break;
}
if(io_c%10==0){
try {
Thread.sleep(10000);
}catch (Exception ex){
logger.warn("Thread.sleep(10000)",ex);
}
}
}
}
解决办法也很简单,既然这是必然的操作,那么加入10次休眠10s这样的话,就可以释放cpu资源。注意,内存资源不会释放,因为线程还未结束,是可用状态