Gestión de memoria del sistema Android
Parte del contenido proviene de las ideas de diseño del kernel de Android de Lin Xuesen.
Gestión de memoria en Android
Parcialmente de /p/94d1cd553c44
Android es esencialmente Linux, así que comencemos con Linux.
La administración de memoria de Linux proporciona un mecanismo confiable para asignar, liberar y proteger memoria para todas las tareas del sistema.
Contenido principal:
Memoria virtual
Asignación y liberación de memoria
Protección de la memoria
Mediante el uso de algún software externo memoria para ampliar la memoria, por ejemplo, divida 4 GB de memoria del disco duro.
Cuando los recursos de memoria son insuficientes, el sistema eliminará automáticamente los bloques de datos de baja prioridad según un algoritmo específico y los almacenará en el disco duro.
Si estos bloques de datos del disco duro se necesitan posteriormente, el sistema genera una instrucción de "fallo de página" y los intercambia nuevamente en la memoria.
Todo esto lo hace automáticamente el kernel del sistema operativo y es "completamente transparente" para las aplicaciones de capa superior.
La dirección lógica y la dirección física de cada proceso no se corresponden directamente y ningún proceso puede acceder al espacio de memoria fuera de su jurisdicción. Es decir, si un proceso cruza deliberadamente el límite de la memoria y accede a él ilegalmente. memoria, el sistema operativo bloqueará inmediatamente el proceso y lo obligará a cerrar el programa, lo que es una fuerte garantía para la seguridad y estabilidad de la aplicación y el sistema operativo.
Una vez que encuentre la forma correcta de acceder al espacio de memoria fuera de sus permisos, el sistema operativo bloqueará inmediatamente y forzará el cierre del programa.
Una vez que la memoria disponible del sistema alcanza un nivel crítico, el sistema finaliza procesos y recupera memoria, priorizando rápidamente los procesos de menor a mayor.
Ubicación de almacenamiento: /proc/lt; PIDgt; /oom_score
Política de prioridad:
Memoria consumida por el proceso
Ocupación del proceso Tiempo de CPU
oom_adj (peso OOM)
La plataforma Android opera bajo la premisa de que la memoria disponible es memoria desperdiciada. En cualquier momento, intenta utilizar toda la memoria disponible. Por ejemplo, el sistema guarda las aplicaciones en la memoria después de cerrarlas para que los usuarios puedan volver rápidamente a ellas. Como resultado, los dispositivos Android suelen funcionar con muy poca memoria disponible. La asignación adecuada de memoria entre procesos importantes del sistema y numerosas aplicaciones de usuario es fundamental para la gestión de la memoria.
Android tiene dos mecanismos principales para manejar situaciones de poca memoria: el demonio de intercambio de núcleo y el asesino de poca memoria.
Cuando el usuario cambia entre aplicaciones, Android mantiene las aplicaciones que no están en primer plano (es decir, no visibles para el usuario) o que ejecutan servicios en primer plano (como reproducción de música) en la lista Usada recientemente (LRU). ) caché. Si el usuario regresa más tarde a la aplicación, el sistema reutiliza el proceso, lo que hace que el cambio de aplicación sea más rápido.
Si su aplicación tiene un proceso de almacenamiento en caché y reserva memoria que no se necesita actualmente, su aplicación afectará el rendimiento general del sistema incluso si el usuario no la está usando. Cuando el sistema se queda sin memoria, finaliza los procesos en la caché LRU, comenzando con el proceso utilizado menos recientemente.
Cuando el sistema comienza a finalizar procesos en la caché LRU, lo hace principalmente de abajo hacia arriba. El sistema también considera qué procesos consumen más memoria, lo que le da al sistema más ganancia de memoria al finalizar. Cuanta menos memoria consuma en la lista LRU, más probabilidades tendrá de permanecer en la lista y poder recuperarse rápidamente.
Para satisfacer todas las demandas de RAM, Android intenta implementar la comunicación entre procesos ****enjoy RAM.
Así es como funciona:
Los dispositivos Android contienen tres tipos diferentes de memoria:
Nota: Tanto la CPU como la GPU acceden a la misma RAM.
La memoria se divide en páginas. Normalmente 4 KB de memoria por página.
Una página se considera disponible o utilizada.
Las páginas libres son RAM no utilizadas.
Las páginas usadas son la RAM que utiliza el sistema y se dividen en las siguientes categorías:
Las páginas limpias contienen una copia exacta del archivo (o parte de un archivo) que existe en la memoria. Una página limpia se convierte en una página sucia cuando ya no contiene una copia exacta del archivo (por ejemplo, como resultado de las operaciones de la aplicación). Las páginas limpias se pueden eliminar porque siempre se pueden regenerar utilizando datos del almacenamiento; las páginas sucias no se pueden eliminar o los datos se perderán.
El kernel realiza un seguimiento de todas las páginas de memoria del sistema.
El sistema debe considerar las páginas compartidas al determinar el uso de memoria de una aplicación. Es probable que las aplicaciones que acceden al mismo servicio o biblioteca consuman páginas de memoria. Por ejemplo, los servicios de Google Play y las aplicaciones de juegos pueden compartir servicios de ubicación.
PSS es útil cuando el sistema operativo quiere saber cuánta memoria utilizan todos los procesos, ya que las páginas no se cuentan varias veces. El cálculo de PSS lleva mucho tiempo porque el sistema necesita determinar qué páginas disfruta **** y cuántos procesos utilizan cuántas páginas. RSS no distingue entre páginas ****-servidas y no-****-servidas (por lo que los cálculos son más rápidos) y es más adecuado para rastrear cambios en las asignaciones de memoria.
El demonio de intercambio de kernel (kswapd) es parte del kernel de Linux y convierte la memoria usada en memoria libre. El demonio se inicia cuando no hay suficiente memoria disponible en el dispositivo. El kernel de Linux establece umbrales altos y bajos para la memoria disponible. Cuando la memoria disponible cae por debajo de un umbral bajo, kswapd comenzará a reclamar memoria. Cuando la memoria libre alcanza un umbral alto, kswapd dejará de reclamar memoria.
kswapd puede recuperar memoria eliminando páginas limpias porque estas páginas tienen respaldo de memoria y no han sido modificadas. Si un proceso intenta abordar una página limpia que ha sido eliminada, el sistema copia la página de la memoria a la RAM, una operación llamada solicitud de paginación.
kswapd moverá las páginas sucias privadas almacenadas en caché y las páginas sucias anónimas a zRAM para su compresión. Esto liberará memoria disponible (páginas libres) en la RAM. Si un proceso intenta tocar una página sucia en zRAM, la página se descomprimirá y se devolverá a la RAM.
Si la cantidad de memoria disponible cae por debajo de un cierto umbral, el sistema comenzará a finalizar los procesos.
El código fuente de implementación de lmkd se encuentra en system/core/lmkd/lmkd.c.
lmkd crea un socket llamado lmkd, cuyo nodo está ubicado en /dev/socket/lmkd, para interactuar con el marco de la capa superior.
Resumen:
LMK_TARGET: El método updateOomLevels() se llama durante el proceso AMS.updateConfiguration(), que enviará una solicitud al directorio /sys/ module/lowmemorykiller/parameters ;
p>
LMK_PROCPRIO: el método AMS.updateOomLevels() envía una solicitud al directorio /sys/module/lowmemorykiller/parameters.
applyOomAdjLocked() llama a setOomAdj() y escribe directamente oom_score_adj en /proc/lt; pidgt; /oom_score_adj;
LMK_PROCREMOVE: AMS.
LMK_PROCREMOVE: AMS.handleAppDiedLocked o AMS .cleanUpApplicationRecordLocked( ) proceso, llame a remove(), esta función actualmente no realiza ninguna operación, pero regresa directamente
Para ayudar aún más a equilibrar la memoria del sistema y evitar terminar el proceso de la APLICACIÓN, ComponentCallbacks2 se puede implementar en la interfaz de la clase Actividad; . El método de devolución de llamada onTrimMemory() proporcionado permite que la aplicación escuche eventos relacionados con la memoria en primer plano o en segundo plano y luego libere objetos según los eventos del sistema en el ciclo de vida de la aplicación o las instrucciones del sistema de que es necesario recuperar la memoria.
La devolución de llamada onTrimMemory() se agregó en Android 4.0 (nivel de API 14).
Para versiones anteriores, puede utilizar onLowMemory(), que es aproximadamente equivalente al evento TRIM_MEMORY_COMPLETE.
Conductor dedicado. (Eliminado en el kernel de Linux 4.12, manejado por kswapd).
Muchas veces, kswapd no puede liberar suficiente memoria para el sistema. En este caso, el sistema usa onTrimMemory() para notificar a la aplicación que se ha quedado sin memoria y que debe asignar menos. Si no hay memoria suficiente, el kernel comenzará a finalizar los procesos para liberar memoria, utilizando Low Memory Killer (LMK) para lograrlo.
Para determinar qué procesos finalizar, LMK utiliza una puntuación de "memoria insuficiente" llamada oom_adj_score para priorizar los procesos en ejecución, y los procesos con puntuaciones más altas finalizan primero.
Las aplicaciones en segundo plano se cierran primero y los procesos del sistema se cierran al final.
La siguiente tabla enumera las categorías de puntuación de LMK de mayor a menor. El elemento con la puntuación más alta en la primera fila se elimina primero:
Android Runtime (ART) y la máquina virtual Dalvik utilizan paginación y mapeo de memoria para administrar la memoria. Las modificaciones a la memoria realizadas por la aplicación al asignar nuevos objetos o tocar páginas asignadas permanecen en la RAM y no se pueden recuperar. La única forma que tiene una aplicación de liberar memoria es a través del recolector de basura.