flume高同時最適化-(17)cpu占有率の高い問題を解決する


ブログでは、「jstack分析cpu占用高応用」を通じて、flume占用が高すぎることを発見し、コードを分析することで、デッドサイクルを発見しました.ここでは、2つのコードの違いを見てみましょう.
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回の休眠10 sを加えると、cpuリソースを解放することができます.スレッドがまだ終了していないため、メモリリソースは解放されません.使用可能な状態です.