2011-08-18 23 views
5

Ho un requisito che ho bisogno di controllare il no.of linee nel file 'A' e se il file 'A' supera il mio limite, allora ho bisogno di copiare il suo contenuto in un altro file ' B 'e quindi cancellare il contenuto del file' A '.come impedire le istruzioni GC_CONCURRENT in Logcat

L'attività di cui sopra devo eseguire tutte le volte Così, ho costruito "Servizio" per fare questo compito. (Voglio correre in fondo).

Dal servizio Sto avviando una discussione per eseguire l'attività di cui sopra. (Ho altre attività in Servizio che dovrebbero essere eseguite parallelamente all'attività).

Sto usando AlarmManager per mantenere in vita il mio "Servizio".

La linea di fondo è che l'attività sopra indicata verrà eseguita sempre. Finora sono riuscito a quello che voglio raggiungere.

Ma ho osservato nell'output LogCat che sta generando enormi istruzioni relative a GC.

come:

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 

ho il sospetto la mia domanda che perde un po 'di memoria o si sta consumando la memoria pesante. per quanto riguarda le prestazioni, voglio evitare questo. Di seguito è riportato lo snippet di codice che sto eseguendo tutto il tempo in thread.

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

quanto sopra è il metodo run() del mio thread.

Per favore aiutatemi quali dovrebbero essere le modifiche che ho bisogno di fare nella mia progettazione per evitare i log GC e rendere la memoria della mia app efficiente.

risposta

5

Si stanno creando troppi "nuovi" oggetti nel ciclo che causano l'esecuzione scorretta del GC ripulendoli dopo aver annullato l'eliminazione. Si desidera renderli variabili di classe statiche, non nuove variabili locali in modo da poter continuare a utilizzare gli stessi oggetti.

+0

Se sto utilizzando la parola chiave 'static', impedisce a' GC_CONCURRENT' di ridurre la memoria virtuale disponibile, un valore di stringa o un'immagine, in modo che l'applicazione sia più lunga? –

Problemi correlati