CORRUPCIÓN DE MEMORIA HEAP EN los errores dlmalloc o dlfree y SIGSEGV en Android ICS 4.0
Ya que no pude encontrar a nadie informando de este comportamiento antes de que pensé en publicar el problema y mi solución aquí para que pueda ayudar a otros que están teniendo este problema. Nuestra aplicación funcionó bien en dispositivos anteriores a ICS. Hemos probado nuestra aplicación en el Galaxy Nexus y el emulador de ICS y vimos accidentes de proceso extraño de la siguiente clase:
CORRUPCIÓN DE LA MEMORIA HEAP EN dlmalloc
- Problema de memoria de mapa de bits de Android - Error: falta de memoria en una asignación de 8294416 bytes
- Razones por las que mi aplicación Android se bloquea en mi teléfono de forma consistente, pero no en mi emulador
- Android: Error de OutOfMemory y el backstack
- El número de referencias de método en un archivo .dex supera los 64K
- Mapa de bits extraño con 1 Mb de Heap
CORRUPCIÓN DE LA MEMORIA HEAP EN dlfree
Señal 11 (SIGSEGV), falla addr deadbaad
El problema es que los accidentes ocurrieron en el espacio nativo por lo que no había ningún código escrito por sí mismo que lo afectó directamente. Puesto que manejamos muchas imágenes en listas y el sistema asigna bitmaps para ésos lo único que vino a la mente era un mal manejo de mapa de bits. Seguimos todas las mejores prácticas en la web e incluso ayudamos a la GC a recopilar recursos innecesarios llamando a bitmap.recycle()
. De todos modos, por alguna razón desconocida la aplicación se estrelló constantemente en Android ICS 4.0.
- Android "cerrar la fuerza" lo que exactamente sucede con la memoria
- Consulta sobre propiedades en /system/build.prop
- Dirección heap no válida y señal fatal 11
- Android Eclipse DDMS> Heap> Causa gris de GC
- Cómo analizar la memoria usando android studio
- Gráficos Android gran consumo de memoria montón? - LibGDX
- EditText que causa la pérdida de memoria
- Tutoriales o ejemplos para la depuración de la memoria de Android
Después de una investigación que eliminó la llamada a recycle()
y todo funciona muy bien ahora. Parece que el recolector de basura en ICS ya borra los mapas de bits correctamente. Nuestra llamada a recycle()
hizo que el sistema intentara desasignar la memoria en el espacio nativo, pero la memoria ya estaba borrada por el sistema. De alguna manera se produjo un mal acceso a la memoria y el sistema se estrelló. Así que si estás programando para Android ICS 4.0 y estás experimentando esos problemas, puedes intentar sin reciclar explícitamente tus mapas de bits.
Si compila su aplicación contra ICS en adelante, no hay necesidad de llamar explícitamente a reciclar ya que esto causará un error de señal 11 (SIGSEGV).