2011-08-18 11 views
5

Mam wymóg, aby sprawdzić nr.of wierszy w pliku "A" i jeśli plik "A" przekracza mój limit, to muszę skopiować jego zawartość do innego pliku " B ', a następnie wyczyść zawartość pliku "A".jak zapobiec instrukcji GC_CONCURRENT w Logcat

Powyższe zadanie muszę wykonywać cały czas, więc skonstruowałem "usługę", aby wykonać to zadanie. (Chcę uruchomić to z powrotem).

Z usługi uruchamiam wątek w celu wykonania powyższego zadania (mam inne zadanie w usłudze, które powinno działać równolegle wraz z zadaniem).

Używam programu AlarmManager do utrzymania przy życiu "usługi".

Najważniejsze jest to, że powyższe zadanie będzie działać cały czas. Do tej pory udało mi się osiągnąć to, co chcę osiągnąć.

Ale zaobserwowałem na wyjściu LogCat, że generuje on ogromne instrukcje związane z GC.

odczuwalna:

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 

Podejrzewam mój wniosek wycieka trochę pamięci lub jest czasochłonne ciężki pamięć. w odniesieniu do wydajności chcę tego uniknąć. Poniżej znajduje się fragment kodu, który używam cały czas w wątku.

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; 
    } 
} 

Powyższe jest metodą run() mojego wątku.

Proszę mi pomóc, jakie zmiany należy wprowadzić w moim projekcie, aby uniknąć dzienników GC i poprawić wydajność pamięci aplikacji.

Odpowiedz

5

Tworzysz zbyt wiele "nowych" obiektów w swojej pętli, co powoduje, że GC zaczyna działać, czyszcząc je po ich usunięciu. Chcesz uczynić je statycznymi zmiennymi klasy, a nie nowymi zmiennymi lokalnymi, aby móc nadal używać tych samych obiektów.

+0

Jeśli używam słowa kluczowego "static", czy zapobiega on "GC_CONCURRENT" zmniejszaniu dostępnej pamięci wirtualnej, wartości ciągu lub obrazu, aby aplikacja działała dłużej? –