El Perfilador de Memoria es un componente del Perfilador de Android que te ayuda a identificar las fugas de memoria y las pérdidas de memoria que pueden provocar tartamudeos, bloqueos e incluso bloqueos de la aplicación. Muestra un gráfico en tiempo real del uso de la memoria de tu aplicación y te permite capturar un volcado de la pila, forzar las recolecciones de basura y rastrear las asignaciones de memoria.
Para abrir el Perfil de Memoria, sigue estos pasos:
- Haz clic en Ver > Herramienta Ventanas > Perfil (también puedes hacer clic en Perfil en la barra de herramientas).
- Selecciona el dispositivo y el proceso de la aplicación que quieres perfilar desde la barra de herramientas de AndroidProfiler. Si ha conectado un dispositivo a través de USB pero no lo ve en la lista, asegúrese de que ha habilitado la depuración USB.
- Haga clic en cualquier lugar de la línea de tiempo MEMORIA para abrir el Perfilador de Memoria.
Alternativamente, puede inspeccionar la memoria de su aplicación desde la línea de comandos withdumpsys, y también ver los eventos GC en logcat.
Por qué deberías perfilar la memoria de tu aplicación
Android proporciona un entorno de memoria gestionada: cuando determina que tu aplicación ya no utiliza algunos objetos, el recolector de basura libera la memoria no utilizada de vuelta al montón. La forma en que Android encuentra la memoria no utilizada se está mejorando constantemente, pero en algún momento, en todas las versiones de Android, el sistema debe pausar brevemente el código. La mayoría de las veces, las pausas son imperceptibles. Sin embargo, si tu aplicación asigna memoria más rápido de lo que el sistema puede recolectar, tu aplicación podría retrasarse mientras el recolector libera suficiente memoria para satisfacer tus asignaciones. El retraso podría hacer que tu aplicación se salte cuadros y causar una lentitud visible.
Incluso si tu aplicación no muestra lentitud, si tiene fugas de memoria, puede retener esa memoria incluso mientras está en el fondo. Este comportamiento puede ralentizar el rendimiento de la memoria del resto del sistema al forzar eventos de recolección de basura innecesarios. Finalmente, el sistema se ve obligado a matar el proceso de tu aplicación para recuperar la memoria. Entonces, cuando el usuario vuelve a su aplicación, debe reiniciar completamente.
Para ayudar a prevenir estos problemas, debe utilizar el Memory Profiler para hacer lo siguiente:
- Buscar patrones de asignación de memoria no deseados en la línea de tiempo que podrían estar causando problemas de rendimiento.
- Volcar el montón de Java para ver qué objetos están utilizando la memoria en cualquier momento. Varios volcados de heap durante un período de tiempo prolongado pueden ayudar a identificar las fugas de memoria.
- Registre las asignaciones de memoria durante la interacción normal y extrema del usuario para identificar exactamente dónde su código está asignando demasiados objetos en poco tiempo o asignando objetos que se filtran.
Para obtener información sobre las prácticas de programación que pueden reducir el uso de la memoria de su aplicación, lea Administrar la memoria de su aplicación.
Resumen del Memory Profiler
Cuando abra por primera vez el Memory Profiler, verá una línea de tiempo detallada del uso de la memoria de su aplicación y accederá a herramientas para forzar la recolección de basura, capturar un heapdump y registrar las asignaciones de memoria.
Figura 1. Memory Profiler
Como se indica en la figura 1, la vista por defecto de Memory Profiler incluye lo siguiente:
- Un botón para forzar un evento de recolección de basura.
-
Un botón para capturar un volcado de heap.
Nota: Un botón para registrar las asignaciones de memoria aparece a la derecha del botón de volcado de heap sólo cuando se conecta a un dispositivo que ejecuta Android 7.1 (nivel de API 25) o inferior.
- Un menú desplegable para especificar la frecuencia con la que el perfilador captura las asignaciones de memoria. La selección de la opción adecuada puede ayudarle a mejorar el rendimiento de la aplicación durante la creación de perfiles.
- Botones para ampliar/reducir la línea de tiempo.
- Un botón para saltar hacia adelante a los datos de memoria en vivo.
- La línea de tiempo de eventos, que muestra los estados de actividad, los eventos de entrada del usuario y los eventos de rotación de la pantalla.
- La línea de tiempo de uso de la memoria, que incluye lo siguiente:
- Un gráfico apilado de la cantidad de memoria que está siendo utilizada por cada categoría de memoria, según lo indicado por el eje y en la izquierda y la clave de color en la parte superior.
- Una línea discontinua indica el número de objetos asignados, como se indica en el eje y de la derecha.
- Un icono para cada evento de recolección de basura.
Sin embargo, si usted está usando un dispositivo que ejecuta Android 7.1 o inferior, no todos los datos de perfil son visibles por defecto. Si ve un mensaje que dice: «El perfil avanzado no está disponible para el proceso seleccionado», debe activar el perfil avanzado para ver lo siguiente:
- Línea de tiempo de los eventos
- Número de objetos asignados
- Eventos de recolección de basura
En Android 8.0 y superiores, la creación de perfiles avanzados siempre está activada para las aplicaciones depurables.
Cómo se cuenta la memoria
Los números que ves en la parte superior del Memory Profiler (figura 2) se basan en todas las páginas de memoria privadas que tu aplicación ha comprometido, según el sistemaAndroid. Este recuento no incluye las páginas compartidas con el sistema u otras aplicaciones.
Figura 2. La leyenda del recuento de memoria en la parte superior del Memory Profiler
Las categorías del recuento de memoria son las siguientes:
- Java: Memoria de objetos asignados desde código Java o Kotlin.
-
Nativo: Memoria de objetos asignados a partir de código C o C++.
Incluso si no estás usando C++ en tu aplicación, es posible que veas algo de memoria nativa utilizada aquí porque el marco de trabajo de Android utiliza la memoria nativa para manejar varias tareas en tu nombre, como cuando se manejan activos de imagen y otros gráficos-a pesar de que el código que has escrito está en Java o Kotlin.
-
Gráficos: Memoria utilizada para las colas del buffer de gráficos para mostrar los píxeles en la pantalla, incluyendo las superficies GL, las texturas GL, etc. (Tenga en cuenta que esta es la memoria compartida con la CPU, no la memoria dedicada a la GPU.)
-
Stack: Memoria utilizada por las pilas nativas y Java en tu aplicación. Suele estar relacionada con el número de hilos que ejecuta tu aplicación.
-
Código: Memoria que tu app utiliza para el código y los recursos, como el bytecode dex, el código dex optimizado o compilado, las bibliotecas .so y las fuentes.
-
Otros: La memoria utilizada por su aplicación que el sistema no está seguro de cómo categorizar.
-
Asignada: El número de objetos Java/Kotlin asignados por tu app. Esto no cuenta los objetos asignados en C o C++.
Cuando se conecta a un dispositivo que ejecuta Android 7.1 e inferior, este recuento de asignación comienza sólo en el momento en que Memory Profiler se conectó a su aplicación en ejecución. Por lo tanto, los objetos asignados antes de iniciar la creación de perfiles no se contabilizan. Sin embargo, Android 8.0 y superior incluye una herramienta de perfilado en el dispositivo que realiza un seguimiento de todas las asignaciones, por lo que este número siempre representa el número total de objetos Java pendientes en su aplicación en Android 8.0 y superior.
Cuando se compara con los recuentos de memoria de la anterior herramienta Android Monitor, el nuevo Memory Profiler registra su memoria de manera diferente, por lo que podría parecer que su uso de memoria es ahora mayor. El Memory Profiler supervisa algunas categorías adicionales que aumentan el total, pero si sólo te preocupas por la memoria de la pila de Java, el número de «Java» debe ser similar al valor de la herramienta anterior.Aunque el número de Java probablemente no coincide exactamente con lo que viste en AndroidMonitor, el nuevo número tiene en cuenta todas las páginas de memoria física que se han asignado a la pila de Java de tu aplicación desde que se bifurcó de Zygote. Así que esto proporciona una representación precisa de la cantidad de memoria física que su aplicación está utilizando realmente.
Ver las asignaciones de memoria
Las asignaciones de memoria muestran cómo se asignó cada objeto Java y referencia JNI en su memoria. En concreto, Memory Profiler puede mostrarle lo siguiente sobre las asignaciones de objetos:
- Qué tipos de objetos se asignaron y cuánto espacio utilizan.
- El seguimiento de la pila de cada asignación, incluyendo en qué hilo.
- Cuando los objetos fueron desasignados (sólo cuando se utiliza un dispositivo con Android 8.0 o superior).
Si su dispositivo está ejecutando Android 8.0 o superior, puede ver sus objectallocations en cualquier momento como sigue: Arrastre en la línea de tiempo para seleccionar la región para la que desea ver las asignaciones (como se muestra en el vídeo 1). No es necesario iniciar una sesión de grabación, ya que Android 8.0 y versiones superiores incluyen una herramienta de creación de perfiles en el dispositivo que realiza un seguimiento constante de las asignaciones de tu aplicación.
Vídeo 1. Con Android 8.0 y superior, seleccione un área de la línea de tiempo existente para ver las asignaciones de objetos
Si su dispositivo está ejecutando Android 7.1 o inferior, haga clic en Grabar memoryallocations en la barra de herramientas de Memory Profiler. Mientras graba, el Perfilador de Memoria registra todas las asignaciones que se producen en su aplicación. Cuando hayas terminado, haz clic en Detener la grabación (el mismo botón; ver vídeo 2) para ver las asignaciones.
Vídeo 2. Con Android 7.1 e inferior, debes grabar explícitamente las asignaciones de memoria
Después de seleccionar una región de la línea de tiempo (o cuando termines una sesión de grabación con un dispositivo con Android 7.1 o inferior), la lista de objetos asignados aparece debajo de la línea de tiempo, agrupados por nombre de clase y ordenados por su recuento de montón.
Para inspeccionar el registro de asignación, siga estos pasos:
- Examine la lista para encontrar objetos que tengan recuentos de montón inusualmente grandes y que puedan estar filtrados. Para ayudar a encontrar las clases conocidas, haga clic en el encabezado de la columna Nombre de la clase para ordenarlas alfabéticamente. A continuación, haga clic en un nombre de clase. El panel de Vista de Instancia aparece a la derecha, mostrando cada instancia de esa clase, como se muestra en la figura 3.
- Alternativamente, puede localizar objetos rápidamente haciendo clic en Filtro, o pulsando Control+F (Comando+F en Mac), e introduciendo un nombre de clase o paquete en el campo de búsqueda. También puedes buscar por nombre de método si seleccionasOrganizar por pila de llamadas en el menú desplegable. Si desea utilizar expresiones reguladas, marque la casilla junto a Regex. Marque la casilla junto aMatch case si su consulta de búsqueda distingue entre mayúsculas y minúsculas.
- En el panel de la vista de instancias, haga clic en una instancia. A continuación, aparece la pestaña Pila de llamadas, que muestra dónde se asignó esa instancia y en qué hilo.
- En la pestaña Pila de llamadas, haga clic con el botón derecho en cualquier línea y elijaSaltar al origen para abrir ese código en el editor.
Figura 3. Los detalles de cada objeto asignado aparecen en la vista de instancias de la derecha
Puede utilizar los dos menús situados encima de la lista de objetos asignados para elegir qué heap inspeccionar y cómo organizar los datos.
Desde el menú de la izquierda, elija qué heap inspeccionar:
- heap por defecto: Cuando el sistema no especifica ningún heap.
- heap de imagen: La imagen de arranque del sistema, que contiene las clases que se precargan durante el arranque. Se garantiza que las asignaciones aquí nunca se mueven o desaparecen.
- zygote heap: El montón de copia en escritura donde un proceso de aplicación se bifurca de en el sistema Android.
- app heap: El heap primario en el que tu app asigna memoria.
- JNI heap: El heap que muestra dónde se asignan y liberan las referencias de la interfaz nativa de Java (JNI).
Desde el menú de la derecha, elige cómo organizar las asignaciones:
- Organizar por clase: Agrupa todas las asignaciones según el nombre de la clase. Este es el valor predeterminado.
- Ordenar por paquete: Agrupa todas las asignaciones basándose en el nombre del paquete.
- Ordenar por pila de llamadas: Agrupa todas las asignaciones en su correspondiente pila de llamadas.
Mejorar el rendimiento de la aplicación durante la creación de perfiles
Para mejorar el rendimiento de la aplicación durante la creación de perfiles, el perfilador de memoria muestrea las asignaciones de memoria periódicamente por defecto. Cuando se realizan pruebas en dispositivos que ejecutan el nivel de API 26 o superior, se puede cambiar este comportamiento utilizando el menú desplegable de seguimiento de asignaciones. Las opciones disponibles son las siguientes:
- Completo: Captura todas las asignaciones de objetos en memoria. Este es el comportamiento por defecto en Android Studio 3.2 y anteriores. Si tiene una aplicación que asigna muchos objetos, es posible que observe ralentizaciones visibles con su aplicación durante la creación de perfiles.
- Sampled: Muestrea las asignaciones de objetos en la memoria a intervalos regulares. Esta es la opción por defecto y tiene menos impacto en el rendimiento de la aplicación mientras se perfila. Las aplicaciones que asignan una gran cantidad de objetos en un corto período de tiempo pueden mostrar ralentizaciones visibles.
- Off: Deja de rastrear la asignación de memoria de su aplicación.
Ver referencias JNI globales
Java Native Interface (JNI) es un marco que permite que el código Java y el código nativo se llamen mutuamente.
Las referencias JNI son gestionadas manualmente por el código nativo, por lo que es posible que los objetosJava utilizados por el código nativo se mantengan vivos durante demasiado tiempo. Algunos objetos de la pila de Java pueden volverse inalcanzables si se descarta una referencia JNI sin haberla borrado explícitamente. Además, es posible agotar el límite de referencias JNI globales.
Para solucionar estos problemas, utilice la vista del montón JNI en el Memory Profiler para examinar todas las referencias JNI globales y filtrarlas por tipos de Java y pilas de llamadas nativas. Con esta información, puede encontrar cuándo y dónde se crean y eliminan las referencias JNI globales.
Mientras su aplicación se está ejecutando, seleccione una parte de la línea de tiempo que desea inspeccionar y seleccione JNI heap en el menú desplegable sobre la lista de clases.A continuación, puede inspeccionar los objetos de la pila como lo haría normalmente y hacer doble clic en los objetos de la pestaña Pila de llamadas de asignación para ver dónde se asignan y liberan las referencias JNI en su código, como se muestra en la figura 4.
Figura 4. Visualización de las referencias JNI globales
Para inspeccionar las asignaciones de memoria del código JNI de tu aplicación, debes implementar tu aplicación en un dispositivo que ejecute Android 8.0 o superior.
Para obtener más información sobre JNI, consulta los consejos de JNI.
Perfiles de memoria nativa
El perfil de memoria de Android Studio incluye un perfil de memoria nativa para las aplicaciones implementadas en dispositivos físicos que ejecutan Android 10; la compatibilidad con dispositivos Android 11 está disponible actualmente en la versión preliminar de Android Studio 4.2.
El perfil de memoria nativa realiza un seguimiento de las asignaciones/desasignaciones de objetos en el código nativo durante un período de tiempo específico y proporciona la siguiente información:
- Asignaciones: Un recuento de los objetos asignados a través de
malloc()
o el operadornew
durante el período de tiempo seleccionado. - Desasignaciones: Un recuento de los objetos reasignados a través de
free()
o el operadordelete
durante el período de tiempo seleccionado. - Tamaño de las asignaciones: El tamaño agregado en bytes de todas las asignaciones durante el periodo de tiempo seleccionado.
- Deallocations Size: El tamaño agregado en bytes de toda la memoria liberada durante el periodo de tiempo seleccionado.
- Total Count: El valor de la columna Allocations menos el valor de la columna Deallocations.
- Tamaño restante: El valor de la columna Tamaño de asignaciones menos el valor de la columna Tamaño de desasignaciones.
Para iniciar una grabación, haga clic en Grabar asignaciones nativas en la parte superior de la ventana deMemory Profiler:
Cuando esté listo para completar la grabación, haga clic en Detener grabación.
Por defecto, Native Memory Profiler utiliza un tamaño de muestra de 32 bytes: Cada vez que se asignan 32 bytes de memoria, se toma una instantánea de la memoria. Un tamaño de muestra más pequeño resulta en instantáneas más frecuentes, produciendo datos más precisos sobre el uso de la memoria. Un tamaño de muestra más grande produce datos menos precisos, pero consumirá menos recursos en su sistema y mejorará el rendimiento durante la grabación.
Para cambiar el tamaño de la muestra del Native Memory Profiler:
- Seleccione Ejecutar > Editar Configuraciones.
- Seleccione el módulo de su aplicación en el panel izquierdo.
- Haga clic en la pestaña Profiling, e introduzca el tamaño de la muestra en el campo etiquetadoIntervalo de muestreo de memoria nativa (bytes).
- Construya y ejecute su aplicación de nuevo.
Capture un volcado de la pila
Un volcado de la pila muestra qué objetos de su aplicación están utilizando la memoria en el momento de capturar el volcado de la pila. Especialmente después de una sesión de usuario extendida, un volcado de la pila puede ayudar a identificar las fugas de memoria mostrando los objetos que aún están en la memoria y que usted cree que ya no deberían estar allí.
Después de capturar un volcado de la pila, puede ver lo siguiente:
- Qué tipos de objetos ha asignado su aplicación y cuántos de cada uno.
- Cuánta memoria está utilizando cada objeto.
- Dónde se guardan las referencias a cada objeto en su código.
- La pila de llamadas donde se asignó un objeto. (Las pilas de llamadas están actualmente disponibles con un volcado de la pila sólo con Android 7.1 e inferior cuando se captura el volcado de la pila mientras se registran las asignaciones.)
Para capturar un volcado de la pila, haga clic en Volcar la pila de Java en la barra de herramientas de Memory Profiler.Mientras se realiza el volcado de la pila, la cantidad de memoria de Java podría aumentar temporalmente.Esto es normal porque el volcado de la pila se produce en el mismo proceso que su aplicación y requiere algo de memoria para recopilar los datos.
El volcado de la pila aparece debajo de la línea de tiempo de la memoria, mostrando todos los tipos de clase en la pila, como se muestra en la figura 5.
Figura 5. Visualización del volcado de heap
Si necesita ser más preciso sobre cuándo se crea el volcado, puede crear un volcado de heap en el punto crítico del código de su aplicación llamandodumpHprofData()
.
En la lista de clases, puede ver la siguiente información:
- Asignaciones: Número de asignaciones en el heap.
-
Tamaño nativo: Cantidad total de memoria nativa utilizada por este tipo de objeto(en bytes). Esta columna sólo es visible para Android 7.0 y superior.
Aquí verás la memoria de algunos objetos asignados en Java porque Android utiliza la memoria nativa para algunas clases del framework, como
Bitmap
. -
Tamaño superficial: Cantidad total de memoria Java utilizada por este tipo de objeto (en bytes).
-
Tamaño retenido: Tamaño total de la memoria retenida debido a todas las instancias de esta clase (en bytes).
Puede utilizar los dos menús situados encima de la lista de objetos asignados para elegir qué volcados de la pila inspeccionar y cómo organizar los datos.
Desde el menú de la izquierda, elija qué pila inspeccionar:
- pila por defecto: Cuando el sistema no especifica ningún heap.
- app heap: El heap primario en el que tu app asigna memoria.
- image heap: La imagen de arranque del sistema, que contiene las clases que se precargan durante el arranque. Se garantiza que las asignaciones aquí nunca se mueven o desaparecen.
- heap de cigoto: El montón de copia en escritura donde un proceso de aplicación se bifurca deen el sistema Android.
Desde el menú de la derecha, elegir cómo organizar las asignaciones:
- Organizar por clase: Agrupa todas las asignaciones según el nombre de la clase. Este es el valor predeterminado.
- Ordenar por paquete: Agrupa todas las asignaciones basándose en el nombre del paquete.
- Ordenar por pila de llamadas: Agrupa todas las asignaciones en su correspondiente pila de llamadas. Esta opción sólo funciona si se captura el volcado del montón mientras se registran las asignaciones. Aun así, es probable que haya objetos en el montón que fueron asignados antes de empezar a grabar, por lo que esas asignaciones aparecen primero, simplemente listadas por el nombre de la clase.
La lista se ordena por la columna Tamaño retenido por defecto. Para ordenar por los valores de una columna diferente, haga clic en el encabezado de la columna.
Haga clic en un nombre de clase para abrir la ventana de la vista de instancias de la derecha (mostrada en la figura 6). Cada instancia listada incluye lo siguiente:
- Profundidad: El número más corto de saltos desde cualquier raíz GC a la instancia seleccionada.
- Tamaño nativo: El tamaño de esta instancia en la memoria nativa.Esta columna es visible sólo para Android 7.0 y superior.
- Shallow Size: Tamaño de esta instancia en memoria Java.
- Tamaño retenido: Tamaño de la memoria que domina esta instancia (según el árbol dominante).
Figura 6. La duración requerida para capturar un heapdump se indica en la línea de tiempo
Para inspeccionar su heap, siga estos pasos:
- Examine la lista para encontrar objetos que tengan recuentos de heap inusualmente grandes y que puedan tener fugas. Para ayudar a encontrar las clases conocidas, haga clic en el encabezado de la columna Nombre de la clase para ordenarlas alfabéticamente. A continuación, haga clic en un nombre de clase. El panel de vista de instancias aparece a la derecha, mostrando cada instancia de esa clase, como se muestra en la figura 6.
- Alternativamente, puede localizar objetos rápidamente haciendo clic en Filtro, o pulsando Control+F (Comando+F en Mac), e introduciendo un nombre de clase o paquete en el campo de búsqueda. También puedes buscar por nombre de método si seleccionasOrganizar por pila de llamadas en el menú desplegable. Si desea utilizar expresiones reguladas, marque la casilla junto a Regex. Marque la casilla junto aMatch case si su consulta de búsqueda distingue entre mayúsculas y minúsculas.
- En el panel de la vista de instancias, haga clic en una instancia. Aparecerá la pestaña Referencias, que muestra todas las referencias a ese objeto.
O bien, haga clic en la flecha situada junto al nombre de la instancia para ver todos sus campos y, a continuación, haga clic en el nombre de un campo para ver todas sus referencias. Si desea ver los detalles de la instancia de un campo, haga clic con el botón derecho del ratón en el campo y seleccione Ir a la instancia.
- En la pestaña Referencias, si identifica una referencia que podría estar perdiendo memoria, haga clic con el botón derecho del ratón y seleccione Ir a la instancia. Esto selecciona la instancia correspondiente del volcado de la pila, mostrando sus propios datos de instancia.
En su volcado de la pila, busque fugas de memoria causadas por cualquiera de los siguientes:
- Las referencias de larga duración a
Activity
,Context
,View
,Drawable
, y otros objetos que podrían mantener una referencia al contenedorActivity
oContext
. - Clases internas no estáticas, como
Runnable
, que pueden contener una instancia deActivity
. - Cachés que retienen objetos durante más tiempo del necesario.
Guardar un volcado de la pila como un archivo HPROF
Después de capturar un volcado de la pila, los datos se pueden ver en Memory Profiler sólo mientras se está ejecutando el perfilador. Cuando se sale de la sesión de perfilado, se pierde el volcado de memoria. Por lo tanto, si quieres guardarlo para revisarlo más tarde, exporta el volcado de memoria a un archivo HPROF. En Android Studio 3.1 e inferior, el botón Exportar captura a archivo está en el lado izquierdo de la barra de herramientas debajo de la línea de tiempo; en Android Studio 3.2 y superior, hay un botón Exportar volcado de montón a la derecha de cada entrada de volcado de montón en el panel Sesiones. En el diálogo Export As que aparece, guarde el archivo con la extensión .hprof
.
Para usar un analizador HPROF diferente comojhat, necesita convertir el archivo HPROF del formato Android al formato HPROF de Java SE.Puede hacerlo con la herramienta hprof-conv
provista en el directorioandroid_sdk/platform-tools/
. Ejecute el comando hprof-conv
con dos argumentos: el archivo HPROF original y la ubicación para escribir el archivo HPROF convertido. Por ejemplo:
hprof-conv heap-original.hprof heap-converted.hprof
Importar un archivo de volcado de heap
Para importar un archivo HPROF (.hprof
), haga clic en Iniciar una nueva sesión de perfilado en el panelSesiones, seleccione Cargar desde archivo y elija el archivo desde el explorador de archivos.
También puede importar un archivo HPROF arrastrándolo desde el explorador de archivos a una ventana del editor.
Detección de fugas en Memory Profiler
Al analizar un volcado de heap en Memory Profiler, puedes filtrar los datos de perfil que Android Studio considera que podrían indicar fugas de memoria para Activity
yFragment
instancias de tu aplicación.
Los tipos de datos que muestra el filtro incluyen los siguientes:
-
Activity
instancias que han sido destruidas pero que siguen siendo referenciadas. -
Fragment
instancias que no tienen unFragmentManager
válido pero que siguen siendo referenciadas.
En ciertas situaciones, como las siguientes, el filtro podría dar falsos positivos:
- Se ha creado un
Fragment
pero aún no se ha utilizado. - Se está almacenando en la caché un
Fragment
pero no como parte de unFragmentTransaction
.
Para utilizar esta función, primero hay que capturar un volcado de heapo importar un archivo de volcado de heap en Android Studio. Para mostrar los fragmentos y las actividades que pueden tener fugas de memoria, seleccione la casilla Activity/Fragment Leaks en el panel heapdump del Memory Profiler, como se muestra en la figura 7.
Figura 7. Filtrando un volcado de heap en busca de fugas de memoria.
Técnicas para perfilar tu memoria
Mientras utilizas el Memory Profiler, debes estresar el código de tu aplicación y tratar de buscar fugas de memoria. Una forma de provocar fugas de memoria en tu aplicación es dejarla funcionar durante un tiempo antes de inspeccionar la pila. Las fugas pueden llegar a la parte superior de las asignaciones en el montón. Sin embargo, cuanto más pequeña sea la fuga, más tiempo tendrá que ejecutar la aplicación para verla.
También puede provocar una fuga de memoria de una de las siguientes maneras:
- Girar el dispositivo de vertical a horizontal y viceversa varias veces mientras está en diferentes estados de actividad. Girar el dispositivo a menudo puede hacer que una aplicación tenga una fuga de un objeto
Activity
,Context
oView
porque el sistema crea elActivity
y si tu aplicación tiene una referencia a uno de esos objetos en otro lugar, el sistema no puede recogerlo de la basura. - Cambia entre tu aplicación y otra aplicación mientras se encuentran en diferentes estados de actividad (navega a la pantallaHome, luego vuelve a tu aplicación).
Consejo: También puedes realizar los pasos anteriores utilizando el marco de pruebas de onkeyrunner.