Tengo una aplicación de Android desarrollada, y estoy en el punto de desarrollo de una aplicación de teléfono donde todo parece estar funcionando bien y quieres declarar la victoria y enviar, pero sabes que solo tiene que haber un poco de pérdida de memoria y recursos ahí; y solo hay 16 MB de almacenamiento dinámico en Android y es aparentemente sorprendentemente fácil de filtrar en una aplicación de Android.
He estado buscando y hasta ahora solo he podido obtener información sobre 'hprof' y 'traceview' y ninguno de los dos ha recibido muchas críticas favorables.
¿Qué herramientas o métodos has encontrado o desarrollado y te gustaría compartir tal vez en un proyecto de SO?
android
memory-leaks
jottos
fuente
fuente
Respuestas:
Uno de los errores más comunes que encontré al desarrollar aplicaciones de Android es el error "java.lang.OutOfMemoryError: el tamaño del mapa de bits supera el presupuesto de VM". Encontré este error con frecuencia en actividades que utilizan muchos mapas de bits después de cambiar la orientación: la Actividad se destruye, se crea nuevamente y los diseños se "inflan" desde el XML que consume la memoria de VM disponible para mapas de bits.
El recolector de basura no asigna correctamente los mapas de bits en el diseño de la actividad anterior porque han cruzado referencias a su actividad. Después de muchos experimentos, encontré una solución bastante buena para este problema.
Primero, establezca el atributo "id" en la vista principal de su diseño XML:
Luego, en el método onDestroy () de su Actividad, llame al método unbindDrawables () pasando una referencia a la Vista principal y luego haga un System.gc ()
Este método unbindDrawables () explora el árbol de vistas de forma recursiva y:
fuente
PageAdapter
y estoy trabajando por este error :(Obtenga el Analizador de memoria Eclipse ( http://www.eclipse.org/mat/ ) Consulte http://kohlerm.blogspot.com/2010/02/android-memory-usage-analysis-slides.html y http: // kohlerm.blogspot.com/search/label/memory
fuente
Principalmente para viajeros de Google del futuro:
Lamentablemente, la mayoría de las herramientas de Java no son adecuadas para esta tarea, ya que solo analizan el JVM-Heap. Sin embargo, todas las aplicaciones de Android también tienen un montón nativo, que también debe ajustarse dentro del límite de ~ 16 MB. Por lo general, se usa para datos de mapa de bits, por ejemplo. Por lo tanto, puede ejecutar fácilmente errores de falta de memoria a pesar de que su JVM-Heap se relaje alrededor de 3 MB, si usa muchos elementos extraíbles.
fuente
La respuesta de @ hp.android funciona bien si solo está trabajando con fondos de mapas de bits pero, en mi caso, tuve que
BaseAdapter
proporcionar un conjunto deImageView
s para aGridView
. Modifiqué elunbindDrawables()
método según lo recomendado para que la condición sea:pero el problema es que el método recursivo nunca procesa los hijos de
AdapterView
. Para abordar esto, en su lugar hice lo siguiente:para que los hijos del
AdapterView
todavía se procesen, el método simplemente no intenta eliminar todos los hijos (lo que no es compatible).Sin embargo, esto no soluciona el problema, ya que
ImageView
administra un mapa de bits que no es su fondo. Por lo tanto, agregué lo siguiente. No es ideal pero funciona:En general, el
unbindDrawables()
método es entonces:Espero que haya un enfoque más basado en principios para liberar esos recursos.
fuente
Buena charla de Google I / O (2011) sobre Gestión de memoria en Android, así como detalles sobre herramientas + técnicas para la creación de perfiles de memoria:
http://www.youtube.com/watch?v=_CruQY55HOk
fuente
Valgrind ha sido portado a Android (patrocinado por Mozilla). Consulte Valgrind en Android: estado actual y soporte Ejecutando Valgrind para Android en ARM (comentario 67).
fuente
Bueno, esas son las herramientas que se enganchan con los formatos únicos que usa Android ... Creo que lo que puede no estar satisfecho es el marco de código de prueba subyacente en uso ...
¿Has intentado simular áreas de código de prueba con Android Mock Framework?
fuente