leaks leak how example java android memory-management memory-leaks garbage-collection

java - leak - Android dalvikvm-heap: Clamp objetivo GC montón



leakcanary (3)

Estoy escribiendo un procedimiento para sincronizar una gran cantidad de contactos con la base de datos de Contactos de Android. La descarga funciona bien para unos 700 contactos, después de lo cual recibo constantemente un error de montón de memoria que llama a un número infinito de declaraciones de GC y termina reiniciando el teléfono. Estoy enfrentando el problema en HTC desire.

Comprobé el tamaño de almacenamiento dinámico de la aplicación utilizando la herramienta de alocación de Heap de DDMS y también extraje el archivo hprof utilizando Debug.dumpHprofData. Ambos registros indicaron que el tamaño del Heap es de aproximadamente 2.4 MB.

Sin embargo, recibo los siguientes registros que indican que el tamaño del almacenamiento dinámico es más de 32.MB

dalvikvm-heap(92): Clamp target GC heap from 33.999MB to 32.000MB dalvikvm(92): GC_FOR_MALLOC freed 2 objects / 48 bytes in 313ms

Inserté las siguientes instrucciones de registro en el bucle donde se escribió mi lógica de descarga de contacts.

Log.e("Memory", "free mem =" +runtime.freeMemory()); Log.e("Memory", "total memory =" +runtime.totalMemory());

Estos son los valores iniciales y finales de la declaración impresa

--------------------------------------------------------------- 11-11 12:56:04.168: ERROR/Memory(25132): free mem =871248 11-11 12:56:04.168: ERROR/Memory(25132): total memory =4202464 --------------------------------------------------------------- 11-11 13:01:55.408: ERROR/Memory(25132): free mem =891640 11-11 13:01:55.408: ERROR/Memory(25132): total memory =4726752 ---------------------------------------------------------------

Esto indica que, al parecer, no hay pérdidas de memoria en la lógica de los contactos de sincronización.

¿Puede alguien decirme por qué se ha aumentado el tamaño del almacenamiento dinámico (hasta 32,00 Mb) a tal punto que el dispositivo se reinicia? Soy nuevo en Android y Java, así que por favor, ve con cuidado conmigo:) .....


Si bien esta no es la mejor respuesta, te recomiendo encarecidamente que veas el video de la administración de la memoria para las aplicaciones de Android en Google IO 2011. Hace un excelente trabajo explicando cómo administrar la memoria y qué significan los mensajes que estás viendo.


Necesitas publicar tu código para que cualquiera pueda ayudar. De lo contrario, supongo que dos cosas:

  • Debido a que su teléfono se está bloqueando, debe hacer algo increíble que permita que su programa se ejecute fuera del espacio de memoria asignado de la VM.
  • ¿Está almacenando todos los contactos en una lista o matriz? Si es así, ahí está tu problema. Esto es lo que los Streams son buenos para arreglar.

  • Al descargar, ¿quiere decir obtener datos de una ubicación remota? Parece que mantiene muchas referencias a sus datos en la memoria. ¿Tienes que? Dependiendo de lo que intente lograr, normalmente hay algunas cosas que podría intentar para minimizar la huella de su memoria. Para empezar, me aseguraría de no utilizar ninguna referencia de cadenas, pero transmitiría los datos directamente al consumidor. Además, intente procesar todos sus datos en fragmentos. ¿También necesita persistir la información en el sistema de archivos? Si es así, transmita directamente al sistema de archivos y evite el almacenamiento de memoria en conjunto. Si publica un código, eso podría ayudar.