2011-08-18 60 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'减少可用虚拟内存,字符串值或图像,以便应用程序运行更长时间? –