The playground

More information here

fugas de Memoria en Android – identificar, tratar y evitar

Johan Olsson Seguir Apr 13, 2016 · 9 min leer En nuestro diario búsqueda de la construcción de mejores aplicaciones, como desarrolladores necesitan tomar muchas cosas en cuenta a fin de mantenerse en el camino, uno de los cuales es para asegurarse de que nuestras aplicaciones no se estrelle. Una causa común de los bloqueos […]
Johan Olsson
Johan Olsson

Seguir

Apr 13, 2016 · 9 min leer

En nuestro diario búsqueda de la construcción de mejores aplicaciones, como desarrolladores necesitan tomar muchas cosas en cuenta a fin de mantenerse en el camino, uno de los cuales es para asegurarse de que nuestras aplicaciones no se estrelle. Una causa común de los bloqueos son las fugas de memoria. Este problema particular puede manifestarse de varias formas. En la mayoría de los casos, vemos un aumento constante en el uso de memoria hasta que la aplicación no puede asignar más recursos e inevitablemente se bloquea. En Java, esto a menudo resulta en una excepción OutOfMemoryException que se lanza. En algunos casos raros, las clases filtradas pueden incluso quedarse el tiempo suficiente para recibir devoluciones de llamada registradas, causando algunos errores realmente extraños y con demasiada frecuencia lanzar la notoria excepción de estado ilegal.

Para ayudar a otros a minimizar el tiempo dedicado al análisis de código, presentaré algunos ejemplos de fugas de memoria, cómo identificarlas en Android Studio y, lo más importante, cómo eliminarlas.

Descargo de responsabilidad

El propósito de esta publicación y sus ejemplos de código es promover una comprensión más profunda de la administración de memoria, especialmente en Java. La arquitectura general, la administración de subprocesos y el manejo de solicitudes HTTP en ejecución que se muestran no son ideales para un entorno de producción y simplemente sirven como soporte del punto que se está señalando: Las fugas de memoria en Android son algo que debe considerarse.

Registrar oyentes

Esto realmente no debería ser un problema, pero con demasiada frecuencia veo llamadas a varios métodos de registro, pero sus contrapartes no registradas no se ven en ninguna parte. Esta es una fuente potencial de fugas, ya que estos métodos están claramente diseñados para equilibrarse entre sí. Sin llamar al método unregister, la instancia probablemente mantendrá una referencia mucho después de que el objeto al que se hace referencia haya terminado y, por lo tanto, comenzará a filtrar memoria. En Android, esto es especialmente problemático si ese objeto es una actividad, ya que a menudo contienen una gran cantidad de datos. Déjame mostrarte cómo podría ser.

En este ejemplo, permitimos que Android LocationManager nos informe sobre las actualizaciones de ubicación. Todo lo que necesitamos para configurar esto es el propio servicio del sistema y una devolución de llamada para recibir las actualizaciones. Aquí implementamos la interfaz de ubicación en la propia actividad, lo que significa que el LocationManager mantendrá una referencia a nuestra actividad. Ahora, si el dispositivo se rotara, se crearía una nueva actividad que reemplazaría a la antigua ya registrada para actualizaciones de ubicación. Dado que un servicio del sistema definitivamente sobrevivirá a cualquier actividad, el LocationManager seguirá manteniendo una referencia a la actividad anterior, lo que imposibilitará que el recolector de basura recupere los recursos aún vinculados a esa actividad en particular, lo que resultará en que se filtre la memoria. La rotación repetida del dispositivo hará que las actividades no recuperables llenen la memoria, lo que en última instancia conducirá a una excepción de salida de memoria.

Pero para corregir una fuga de memoria, primero tenemos que ser capaces de encontrarla. Afortunadamente, Android Studio tiene una herramienta incorporada llamada Monitor Android que podemos usar para observar el uso de la memoria, entre otras cosas. Todo lo que realmente tenemos que hacer es abrir el Monitor de Android e ir a la pestaña Monitores para ver cuánta memoria se usa y asigna en tiempo real.

El Android Monitor en Android Studio 2.0

Cualquier interacción que cause la asignación de recursos se reflejará aquí, por lo que es un lugar ideal para realizar un seguimiento del uso de recursos de su aplicación. Para encontrar nuestra fuga de memoria, necesitamos saber qué contiene la memoria en un momento en el que sospechamos que la memoria se ha filtrado. Para este ejemplo en particular, todo lo que tenemos que hacer es iniciar nuestra aplicación, girar el dispositivo una vez y luego invocar la acción de Volcado de pila Java (junto a Memoria, el tercer icono de la izquierda). Esto generará un archivo hprof, que contiene una instantánea de memoria en el momento en que invocamos la acción. Después de un par de segundos, Android Studio abre automáticamente el archivo, lo que nos proporciona una representación visual nítida de la memoria para facilitar el análisis.

No profundizaré en cómo navegar por el enorme montón de memoria. En su lugar, dirigiré su atención a las Tareas del Analizador en la esquina superior derecha de la captura de pantalla a continuación. Todo lo que tiene que hacer para detectar la fuga de memoria introducida en el ejemplo anterior es verificar Detectar actividades filtradas y luego presionar reproducir para que la actividad filtrada se muestre en los Resultados del análisis.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.