Uso de memoria del mapa de bits

Los mapas de bits suelen ser los objetos que más memoria consumen en una app. Las operaciones de decodificación y escalamiento suelen estar en la ruta crítica para la renderización de fotogramas. Optimizar el uso de memoria de mapas de bits proporciona mejoras significativas en la capacidad de respuesta de la IU, la duración de la batería y la estabilidad general, ya que reduce los bloqueos, los errores de ANR y las finalizaciones de procesos relacionadas con OOM.

Identifica el uso elevado de memoria de mapa de bits

Android vitals proporciona métricas sobre el espacio en memoria de mapa de bits de una app agregando datos de dispositivos Android. De forma predeterminada, estas métricas se calculan como un resumen de 28 días de datos diarios. Estos datos ayudan a identificar tendencias y posibles regresiones en la eficiencia de la memoria en diferentes tipos y versiones de dispositivos.

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

  • Primer plano: El proceso de la app es visible. Se espera que el P99 sea significativamente más alto en primer plano que en otros estados del proceso, pero los desarrolladores deben investigar si la proporción P99/P50 es significativa (p.ej., superior a 3.5 veces), ya que esto suele indicar una fuga de memoria de mapa de bits. Puedes identificar esto buscando una divergencia entre el uso típico (P50) y el uso atípico (P99). Mientras que el aumento general del tamaño de los recursos infla la memoria de manera uniforme en todos los percentiles, las fugas de memoria se acumulan con el tiempo, lo que sesga en gran medida los datos finales (P99). Asegúrate de que las asignaciones de mapas de bits en primer plano no persistan de forma innecesaria después de que la app pase a otros estados.
  • Servicios percibidos por el usuario: El proceso de la app se ejecuta en un estado perceptible. Esto incluye servicios en primer plano, trabajos acelerados y trabajos de transferencia de datos iniciados por el usuario. Las apps no deben retener asignaciones de mapas de bits pesadas en primer plano cuando se realiza la transición a estos estados. Debido a que estos servicios están diseñados para tareas de larga duración, conservar recursos grandes degrada la experiencia general del usuario y obliga al daemon de cierre por falta de memoria (LMKD) a recuperar memoria finalizando los procesos de menor prioridad.
  • Segundo plano: La app ejecuta un servicio en segundo plano o se envió recientemente a segundo plano, pero aún no se almacenó en caché. Debido a que este estado del proceso es menos importante que los procesos en primer plano o perceptibles, las apps deben liberar de forma explícita los recursos de mapa de bits grandes aquí para reducir la presión de la memoria.
  • En caché: La app está en un estado almacenado en caché. Este estado es muy sensible a la presión de la memoria del sistema, como los LMK. Las apps deben reducir de forma proactiva el uso de memoria de mapa de bits en este estado para evitar que el SO las expulse.

Factores que contribuyen al uso elevado de memoria de mapas de bits

También se puede incluir en el cálculo la memoria virtual que nunca se usó. Si observas un uso de memoria de mapas de bits inesperadamente alto, verifica que no estés asignando memoria que no se use.