2011-08-18 15 views
5

Tengo un requisito que necesito comprobar el n. ° de líneas en el archivo 'A' y si el archivo 'A' excede mi límite, entonces necesito copiar su contenido en otro archivo ' B 'y luego borrar el contenido del archivo' A '.cómo prevenir declaraciones GC_CONCURRENT en Logcat

La tarea anterior tengo que ejecutar todas las veces Entonces, construí el "Servicio" para hacer esta tarea. (Quiero ejecutar esto en segundo plano).

Desde el Servicio estoy iniciando un hilo para ejecutar la tarea anterior. (Tengo otra tarea en Servicio que debe ejecutarse en paralelo junto con la tarea).

Estoy usando AlarmManager para mantener vivo mi "Servicio".

En pocas palabras, la tarea anterior se ejecutará todo el tiempo. Hasta ahora he tenido éxito en lo que quiero lograr.

Pero he observado en el resultado de LogCat que está generando enormes declaraciones relacionadas con GC.

igual:

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 

sospecho que mi solicitud se escapa algo de memoria o se consume la memoria pesada. con respecto al rendimiento. Quiero evitar esto. A continuación se muestra el fragmento de código que estoy ejecutando todo el tiempo en el hilo.

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

el método anterior es el método run() de mi hilo.

Por favor, ayúdenme, cuáles deberían ser los cambios que necesito hacer en mi diseño para evitar los registros de GC y hacer que la memoria de mi aplicación sea eficiente.

Respuesta

5

Está creando demasiados objetos "nuevos" en el ciclo, lo que está provocando que el GC se ejecute de forma salvaje limpiándolos después de anularlos. Desea hacer que sean variables de clase estáticas, no nuevas variables locales para que pueda seguir usando los mismos objetos.

+0

Si utilizo la palabra clave 'static', ¿impide que' GC_CONCURRENT' reduzca la memoria virtual disponible, un valor de cadena o una imagen, de modo que la aplicación se ejecute más tiempo? –