La memoria es un recurso crítico y limitado en los dispositivos con Android. Como desarrollador de la plataforma de Android o fabricante de equipos originales, comprender cómo funciona la memoria en todos los niveles, desde el entorno de ejecución de Java hasta el kernel de Linux, es esencial para compilar un sistema estable y de alto rendimiento.
En esta guía, se proporciona una descripción general completa de la arquitectura de memoria de Android, las herramientas disponibles para el análisis y ejercicios prácticos que te ayudarán a identificar y resolver problemas relacionados con la memoria.
Objetivos
Cuando completes esta guía, podrás hacer lo siguiente:
- Explicar los conceptos fundamentales de la memoria de Android, incluidos el modelo de proceso de Zygote y los archivos asignados a la memoria
- Diferenciar entre el tamaño del conjunto residente (RSS), el tamaño del conjunto proporcional (PSS) y el tamaño del conjunto único (USS)
- Usa herramientas de línea de comandos estándar, como
dumpsys meminfoyshowmap, para evaluar rápidamente el uso de memoria. - Captura y analiza volcados de montón de Java con AHAT para encontrar fugas y asignaciones excesivas.
- Usa Perfetto y
heapprofdpara generar perfiles de la memoria nativa y de Java en todo el sistema. - Comprende los indicadores de presión de memoria en todo el sistema, como la información de bloqueo por presión (PSI), y supervisa la actividad del optimizador de poca memoria (LMK).
- Observa la actividad de recuperación a nivel del kernel, incluido el intercambio de ZRAM y la expulsión de la caché de páginas.
Estructura de la guía
Esta guía se organiza en las siguientes secciones, diseñadas para leerse de forma secuencial:
- Conceptos fundamentales: Los principios técnicos básicos de la memoria de Android
- Herramientas de evaluación rápida: Usa
meminfo,showmapyprocstatspara realizar una clasificación rápida. - Análisis de la memoria de Java: Análisis detallados del montón de Java con AHAT
- Mapas de bits y memoria: Comprende cómo las imágenes afectan la RAM y usa herramientas para generar perfiles de ellas.
- Cómo analizar la memoria nativa: Genera perfiles de memoria de C/C++ con Perfetto y
heapprofd. - WebView y memoria: Comprende la arquitectura de varios procesos y el espacio en memoria de los WebViews.
- El código de la app es memoria: Comprende cómo la carga de clases y el aumento de tamaño de los archivos DEX afectan la RAM.
- Subprocesos y memoria: Analiza el costo de las pilas de subprocesos nativos.
- Localidad y rendimiento de la memoria: Comprender cómo los patrones de acceso a los datos afectan el rendimiento de la CPU.
- Vinculaciones de servicios y estados de procesos: Comprende cómo las dependencias entre procesos afectan las puntuaciones de OOM.
- Solución de problemas en todo el sistema: Supervisa PSI, LMK, intercambio de ZRAM y expulsión de caché de páginas.
- Recuperación de memoria: expulsión y swap: Comprende memcg,
la carga y la recuperación proactiva con
memory.reclaim. - Interacción entre kswapd y lmkd: Comprende cómo funcionan kswapd y lmkd juntos bajo presión.
- Devolver páginas de memoria al SO: Usa
madviseyposix_fadvisepara devolver páginas de montón y de caché de archivos sin usar al kernel. - Mantén activo el trabajo en segundo plano con un proceso optimizado: Mueve los servicios en segundo plano y los trabajadores a un proceso dedicado para que la memoria de gráficos y la IU no se mantengan con una prioridad elevada.
Requisitos previos y entorno
En esta guía, se presentan flujos de trabajo de referencia, datos de comparativas y casos de éxito que demuestran cómo diagnosticar y resolver problemas de memoria de Android.
- Herramientas de análisis: Las técnicas de esta guía usan principalmente herramientas de rendimiento estándar de Android, como Perfetto,
dumpsys meminfo,showmapy AHAT. - Privilegios raíz: Algunos flujos de trabajo de diagnóstico a nivel del sistema (como la inspección de la presión de la memoria del kernel o los contadores de PMU de hardware) requieren privilegios raíz elevados (
adb root) en un dispositivo userdebug o una compilación de emulador.
Comienza aquí: Conceptos fundamentales