2011-08-18 4 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'が使用可能な仮想メモリ、文字列値、またはイメージを減らして、アプリケーションを長く実行することを防ぎますか? –

関連する問題