Cómo encontrar pérdidas de memoria en la aplicación de Android

Encontrar fugas requiere una buena comprensión de cómo funciona GC. Requiere diligencia en la redacción del código y la revisión del código. Pero en Android, hay algunas buenas herramientas que pueden ayudarlo a identificar posibles fugas o asegurarse de que haya una fuga cuando algún código parezca sospechoso.

1. fugas canario from Square es una buena herramienta para detectar pérdidas de memoria en su aplicación. Crea referencias débiles a actividades en su aplicación. (También puede personalizarlo agregando relojes a cualquier otro objeto). Luego verifica si la referencia se borra después de GC. De lo contrario, volca el montón en un archivo .hprof y lo analiza para confirmar si hay una fuga. Si hay una, muestra una notificación y en una aplicación separada, muestra el árbol de referencia de cómo ocurre la fuga. Puede encontrar más información sobre Leak Canary en este artículo: LeakCanary: detecte todas las pérdidas de memoria . Le recomiendo que instale Leak Canary en su desarrollador / versión de prueba. Ayuda a los desarrolladores y al control de calidad a encontrar pérdidas de memoria antes de que su aplicación llegue a las manos de sus usuarios.

2. Android Studio tiene una herramienta útil para detectar pérdidas de memoria. Si sospecha que un fragmento de código en su aplicación podría filtrar una Actividad, puede hacerlo.

Paso 1: compile y ejecute la compilación de depuración en un dispositivo o emulador conectado a su computadora.

Paso 2: Vaya a la actividad sospechosa, luego regrese a la actividad anterior que mostrará la actividad sospechosa de la pila de tareas.

Paso 3: en Android Studio -> ventana de Android Monitor -> sección Memoria, haga clic en el botón Initiate GC . Luego haga clic en el botón Dump Java Heap .

Paso 4: Cuando se presiona el botón Dump Java Heap , Android Studio abrirá el archivo .hprof . En el visor de archivos hprof, hay un par de formas en que puede verificar la pérdida de memoria. Puede usar la Analyzer Tasks del Analyzer Tasks en la esquina superior derecha para detectar actividades filtradas automáticamente. O puede cambiar el modo de vista a Package Tree View desde la esquina superior izquierda, encontrar la actividad que debe destruirse. Verifique el Total Count del objeto de actividad. Si hay 1 o más instancias, significa que hay una fuga.

Paso 5: Una vez que encuentre la Actividad filtrada, verifique el árbol de referencia en la parte inferior y descubra qué objeto hace referencia a la actividad que debería haber estado muerta.

¿Cuáles son los patrones de fuga comunes?

Hay muchas formas en que puede causar una pérdida de memoria en Android. Para resumir, hay principalmente tres categorías.

  1. Fuga de actividad a una referencia estática
  2. Fuga de actividad a un subproceso de trabajo
  3. Hilo de fuga en sí

Adiós !!

Me alegro de que hayas preguntado, porque las personas solo quieren el resultado final y no piensan en su estilo de codificación que da como resultado pérdidas de memoria …

Para encontrar fugas de memoria, definitivamente puede usar la biblioteca LeakCanary y una vez que haya resuelto su problema, simplemente elimínelo del grado, pero si desea encontrarlo, use su monitor de estudio de Android, que muestra su gráfico de memoria, uso de CPU en tiempo de ejecución ..

Cuando está ejecutando su aplicación y en el gráfico de memoria si ve un aumento repentino al abrir alguna actividad o algo así, es un indicador de que su actividad está perdiendo memoria …

En esa sección de memoria tienes tres opciones, básicamente puedes ejecutar el recolector de basura, volcar el montón de Java, rastrear la asignación de memoria

La opción Dump Java heap le dará un informe que le mostrará lo que todavía está presente en su montón de aplicaciones y desde allí puede encontrar lo que no debería estar presente pero es …

El seguimiento de asignación necesita un punto de inicio y un punto final, por lo que si inicia el seguimiento de asignación antes de un pico en el gráfico de memoria y detiene el seguimiento después de eso, obtendrá un informe de asignación de memoria entre esta región de tiempo …

Pero lo más importante es resolver / evitar pérdidas de memoria en el código ,,

Las pérdidas de memoria ocurren cuando su actividad está en su modo de finalización, pero hay alguna referencia para esa actividad (contexto) que ha pasado descuidadamente y, por lo tanto, su actividad no puede eliminarse del montón ahora y ha filtrado la memoria de esa actividad, esto es solo un ejemplo que puede solucionarse pasando el contexto correcto, es decir, no pase (“esto”) en todas partes que desee intentar pasar (getApplicationContext) más a menudo porque devuelve un objeto que es singleton y, por lo tanto, no se crea más de una vez…

Así que investigue más sobre las causas de las pérdidas de memoria que lo ayudarán a analizar su código y desarrollar una aplicación a prueba de fugas … gracias …

Hay muchas maneras de hacerlo. Sugeriré algunos métodos que conozco.

Método 1:

En el estudio de Android, en la sección del monitor de Android hay un botón para obtener el volcado del montón. Si hace clic en ese botón, obtendrá el archivo hprof, que se puede utilizar para obtener las pérdidas de memoria.

Método 2:

Hay una biblioteca de terceros llamada canario de fugas, puede usarla en su aplicación para detectar fugas de memoria.

enlace a la biblioteca: square / leakcanary

Si usa Android Studio, hay una herramienta muy ingeniosa llamada heap viewer que se puede usar para detectar pérdidas de memoria en la actividad. Para encontrar una pérdida de memoria en una actividad, intente girar la orientación del teléfono, digamos 5 a 6 veces. Ahora, si puede haber alguna pérdida de memoria en su actividad, cada instancia todavía estaría en el montón. Para verificar este montón, puede usar el visor de montón en el estudio de Android sobre el que puede buscar en Google, donde puede encontrarlo en el estudio de Android y stackoverflow es un mejor lugar para buscar tales preguntas, estas preguntas ya han sido respondidas maravillosamente allí.