2011-08-18 62 views
5

我有一個要求,我需要檢查文件'A'中的no.of行,如果文件'A'超過我的限制,那麼我需要將其內容複製到其他文件' B'然後清除文件'A'的內容。如何防止Logcat中的GC_CONCURRENT語句

上面的任務我必須執行所有的時間所以,我構建了「服務」來完成這個任務。 (我想在後臺運行)。

從服務我啓動一個線程來執行上面的任務(我有服務中的其他任務應與任務並行運行)。

我使用AlarmManager來保持我的「服務」活着。

底線是上面的任務會一直運行。到目前爲止,我成功地實現了我想要實現的目標。

但我在LogCat輸出中發現它正在生成與GC相關的大量語句。

像:

D/dalvikvm(2579): GC_CONCURRENT freed 483K, 62% free 2608K/6727K, external 1628K/2108K, paused 2ms+2ms 
D/dalvikvm(2579): GC_CONCURRENT freed 469K, 62% free 2608K/6727K, external 1628K/2108K, paused 34ms+2ms 
D/dalvikvm(2579): GC_CONCURRENT freed 466K, 62% free 2608K/6727K, external 1628K/2108K, paused 1ms+2ms 
D/dalvikvm(2579): GC_CONCURRENT freed 472K, 62% free 2609K/6727K, external 1628K/2108K, paused 7ms+2ms 
D/dalvikvm(2579): GC_CONCURRENT freed 473K, 62% free 2607K/6727K, external 1628K/2108K, paused 2ms+1ms 
D/dalvikvm(2579): GC_CONCURRENT freed 473K, 62% free 2607K/6727K, external 1628K/2108K, paused 1ms+2ms 
D/dalvikvm( 263): GC_EXPLICIT freed 351K, 58% free 3118K/7303K, external 10278K/11844K, paused 42ms 

我懷疑我的應用程序泄露一些內存,或者是消耗高內存。 關於性能我想避免這一點。 下面是我一直在線程中運行的代碼片段。

public void run() 
{ 
    while (true) { 
     if (WifiLogCollector.stoopThread) 
      return; 
     LineNumberReader lineNumberReader = new LineNumberReader(new FileReader(textfile)); 
     lineNumberReader.skip(Long.MAX_VALUE); 

     if ((lineNumberReader.getLineNumber()) > 20000) { 

      FileChannel source = null; 
      FileChannel destination = null; 

      try { 
       source = new FileInputStream("/mnt/sdcard/textfile.txt").getChannel(); 
       destination = new FileOutputStream("/mnt/sdcard/textbackupfile.txt") 
           .getChannel(); 
       destination.transferFrom(source, 0, source.size()); 
      } finally { 
       if (source != null) { 
        source.close(); 
        source = null; 
       } 
       if (destination != null) { 
        destination.close(); 
        destination = null; 
       } 
      } 

      PrintWriter writer = new PrintWriter(/mnt/sdcard/textfile.txt); 
      writer.print(""); 
      writer.close(); 
      writer = null; 

     } 

     lineNumberReader.close(); 
     lineNumberReader = null; 
    } 
} 

以上是我的線程的run()方法。

請幫助我在我的設計中應該做些什麼改變,以避免GC日誌並使我的應用程序內存高效。

回答

5

您正在循環中創建太多「新」對象,導致GC在將它們清空後將其運行爲清理。你想讓它們成爲靜態類變量,而不是新的局部變量,所以你可以繼續使用相同的對象。

+0

如果我使用'static'關鍵字,是否阻止'GC_CONCURRENT'減少可用虛擬內存,字符串值或圖像,以便應用程序運行更長時間? –