Uso de memoria (RSS anónimo + intercambio)

El uso de memoria (RSS anónimo + intercambio) es una métrica de Android vitals que refleja el uso de memoria de tu app.

La memoria anónima es la memoria no respaldada por un archivo en el almacenamiento, como las asignaciones de montón y la memoria asignada por mmap. Esto captura las asignaciones de memoria dinámica de tu app, incluido el montón de Java o Kotlin, las asignaciones de montón nativas no administradas (donde los datos de píxeles de Bitmap residen en Android 8.0 [nivel de API 26] y versiones posteriores) y las pilas de ejecución de subprocesos. Si bien el SO puede descartar la memoria respaldada por archivos bajo presión, no puede descartar la memoria anónima.

El tamaño del conjunto residente (RSS) es la cantidad total de páginas de memoria (tanto compartidas como no compartidas) que usa un proceso y que se almacenan en la RAM física. Una página se considera "compartida" si más de un proceso accede a ella (como las apps que acceden a la misma biblioteca).

En el caso de la memoria anónima, el sistema puede escribir páginas en el espacio de intercambio (o zRAM en Android) cuando la memoria está bajo presión. El sistema puede volver a leer estas páginas desde el intercambio si es necesario.

En conjunto, el uso de memoria (RSS anónimo + intercambio) es una medida de la cantidad total de páginas de memoria de tu app que no están respaldadas por un archivo en el almacenamiento, incluida cualquier memoria que también conserve el sistema en el intercambio. El seguimiento del RSS anónimo + intercambio garantiza que veas la huella de memoria verdadera y no desalojable de tu app.

Si el uso de memoria de tu app es alto, investiga más y soluciona el problema con la guía de esta página.

Identifica el uso elevado de memoria

Android vitals

Android vitals comparte el uso de memoria de tu app desglosado por los siguientes estados de proceso:

  • Primer plano: El proceso de la app es visible. Un P99 alto aquí suele afectar el rendimiento percibido por el usuario (bloqueos o fallas por falta de memoria) y se debe en gran medida a la retención de componentes o actividades de la IU que ya no son necesarios.
  • Servicios percibidos por el usuario: El proceso de la app se ejecuta en un estado perceptible. Esto incluye servicios en primer plano, tareas aceleradas y tareas de transferencia de datos iniciadas por el usuario. También puede extenderse a servicios vinculados al sistema o servicios vinculados por otras apps. Como estos servicios están diseñados para tareas de larga duración, retener la memoria debido a pérdidas o no liberar recursos puede aumentar la cola de P99 con el tiempo.
  • Segundo plano: La app ejecuta un servicio en segundo plano o se ejecutó recientemente en segundo plano, pero aún no se almacenó en caché. Aquí es donde se pueden acumular las pérdidas de procesamiento en segundo plano y los recursos no liberados. Como este estado de proceso es menos importante que los procesos en primer plano o perceptibles, intenta evitar retener grandes cantidades de memoria en este estado.
  • Almacenamiento en caché: La app está en estado de almacenamiento en caché. Este estado es muy sensible a la presión de la memoria del sistema, como los LMK. Como el SO puede desalojar este estado de proceso a voluntad, este estado solo se proporciona para fines de depuración.

Para comprender cómo se correlacionan estos estados de proceso con las devoluciones de llamada onTrimMemory, consulta la guía para liberar memoria en respuesta a eventos.

Android vitals también desglosa el uso de memoria de tu app por buckets de RAM. La métrica de uso de memoria se muestra como una línea de tiempo de valores percentiles diarios, junto con el valor diario más reciente para los percentiles 50 y 90.

Una vez que hayas identificado tu modelo de referencia de memoria, sigue la guía para diagnosticar y mejorar el uso excesivo de memoria.

Identifica pérdidas de memoria con la asimetría de la cola

Para identificar pérdidas de memoria, busca una divergencia entre tus usuarios típicos (P50) y de cola (P90) en Android vitals. Si bien el aumento general de recursos aumenta la memoria de manera uniforme en todos los percentiles, las pérdidas de memoria se acumulan con el tiempo, lo que sesga en gran medida los datos de la cola.

Debes comparar tus métricas P90 y P99 con tu modelo de referencia P50 por nombre de proceso. Si tu proporción de P90 a P50 supera 3.5 veces, indica una posible fuga de memoria durante sesiones extendidas. En ciertos casos de uso, una proporción elevada no siempre indica una pérdida, pero debes evaluar el flujo de trabajo específico para determinar si el uso elevado de memoria es un comportamiento esperado.

Recursos

Diagnostica el uso excesivo de memoria de forma local

Para comenzar a diagnosticar la fuente del uso excesivo de memoria, puedes capturar un volcado de montón con Record heap dump en la configuración para desarrolladores, Android Studio o Perfetto. Te recomendamos que comiences capturando un volcado de montón de forma local después de probar los recorridos principales del usuario de tu app.

En especial, te recomendamos probar los siguientes recorridos del usuario:

  • Sesiones de WebView y navegador integrado en la app
  • Desplazamiento infinito con mucho contenido multimedia
  • Flujos de creación y edición de recursos

Para investigar posibles pérdidas de memoria, primero identifica los procesos que consumen más recursos con la tabla Process name en el panel de uso de memoria de Android vitals. Luego, ejecuta los recorridos del usuario correspondientes de forma local y recopila volcados de montón en diferentes estados de proceso (visible, servicio en primer plano y almacenado en caché) para verificar si la app libera memoria después de ejecutarse en segundo plano.

Si depuras problemas de memoria con el Generador de perfiles de Android Studio, puedes usar también la integración de LeakCanary para optimizar la detección de pérdidas y mapas de bits duplicados para optimizar el uso de imágenes.

Después de recopilar el volcado de montón, te recomendamos que uses las habilidades de IA de Perfetto para analizar el volcado de montón y, así, identificar posibles fuentes de uso elevado de memoria.

Este es un ejemplo de lo que podrían responder las habilidades de IA:

I have completed the analysis of memory leaks and bitmap issues for [app] using the provided Perfetto trace.
  Summary of Findings
  The investigation identified a critical memory pressure issue caused by massive bitmap retention within the app process.
...
Recommendations for [app]
   1. [Library] Image Cache Optimization:
       * Review the [Library] caching strategy. Ensure that bitmaps
         loaded for animations are released or downsampled when the animation is
         not in the foreground.
   2. Asset Resolution Audit:
       * The 14.7 MB average size suggests full-screen or extremely high-density assets. Audit the [library] files in the native_home component to ensure they are not using unnecessarily large source images.
   3. View Lifecycle Management:
       * Investigate why 21 [LibraryImage] instances are alive simultaneously. Ensure that views in the bottom
      tab are properly detached or their animations are cleared when switching between tabs.
   4. Fix Surface Leaks:
       * Address the Surface.release failures observed in the logs, as these can lead to both memory leaks and
         native resource exhaustion.

Recursos adicionales para interpretar volcados de montón

Los siguientes recursos proporcionan más información para interpretar volcados de montón y depurar el uso de memoria:

  • Análisis manual: Usa la guía del Explorador de volcados de montón de Perfetto para aprender a navegar por las visualizaciones de volcados de montón y a interpretarlas en la IU de Perfetto.
  • Asignaciones de Java/Kotlin: Lee Cómo visualizar tu primer volcado de montón de ART para obtener un instructivo paso a paso sobre el análisis de volcados de montón de Android Runtime (ART).
  • Asignaciones nativas: Consulta la documentación de la generación de perfiles nativa de Perfetto para aprender a recopilar y analizar perfiles de memoria nativos (C/C++).
  • Inspección de la CLI: Usa adb dumpsys meminfo para obtener un desglose rápido del uso de memoria de tu app en un dispositivo.
  • Análisis asistido por IA: Aprovecha las habilidades de IA de Perfetto para ejecutar análisis potenciados por LLM que te ayuden a detectar pérdidas de memoria y asignaciones excesivas en tus seguimientos.
  • Análisis basado en SQL: Usa las habilidades de análisis de seguimiento y SQL de Perfetto para ejecutar consultas estructuradas y secuencias de comandos especializadas para analizar datos de seguimiento complejos.

Mejora el uso de memoria

Consulta estas secciones para obtener más información sobre cómo mejorar el uso de memoria de tu app:

Para obtener instrucciones detalladas sobre cómo solucionar problemas de memoria, consulta la guía Administra la memoria de tu app.