La mémoire est une ressource essentielle et limitée sur les appareils Android. En tant que développeur de la plate-forme Android ou OEM, il est essentiel de comprendre le fonctionnement de la mémoire à tous les niveaux, de l'environnement d'exécution Java au noyau Linux, pour créer un système performant et stable.
Ce guide fournit une présentation complète de l'architecture de la mémoire Android, des outils disponibles pour l'analyse et des exercices pratiques pour vous aider à identifier et à résoudre les problèmes liés à la mémoire.
Objectifs
Après avoir lu ce guide, vous serez en mesure de :
- expliquer les concepts fondamentaux de la mémoire Android, y compris le modèle de processus Zygote et les fichiers mappés en mémoire ;
- faire la différence entre la taille de l'ensemble résident (RSS), la taille de l'ensemble proportionnel (PSS) et la taille de l'ensemble unique (USS) ;
- utiliser des outils de ligne de commande standards tels que
dumpsys meminfoetshowmappour évaluer rapidement l'utilisation de la mémoire ; - capturer et analyser les vidages de tas Java à l'aide d'AHAT pour détecter les fuites et les allocations excessives ;
- utiliser Perfetto et
heapprofdpour profiler la mémoire Java et la mémoire native dans l'ensemble du système ; - comprendre les indicateurs de pression de la mémoire à l'échelle du système, tels que les informations sur la pression de blocage (PSI, Pressure Stall Information), et surveiller l'activité du tueur de mémoire faible (LMK, Low Memory Killer) ;
- observer l'activité de récupération au niveau du noyau, y compris l'échange ZRAM et l'éviction du cache de pages.
Structure du guide
Ce guide est organisé en sections conçues pour être lues de manière séquentielle :
- Concepts fondamentaux : principes techniques de base de la mémoire Android.
- Outils d'évaluation rapide : utilisation de
meminfo,showmap, etprocstatspour un tri rapide. - Analyse de la mémoire Java : exploration approfondie du tas Java avec AHAT.
- Bitmaps et mémoire : comprendre l'impact des images sur la RAM et utiliser des outils pour les profiler.
- Analyse de la mémoire native : profilage de la mémoire C/C++ avec
Perfetto et
heapprofd. - WebView et espace mémoire utilisé : comprendre l'architecture multiprocessus et l'espace mémoire utilisé des WebView.
- Le code d'application est de la mémoire : comprendre l'impact du chargement de classe et du gonflement dex sur la RAM.
- Threads et mémoire : analyse du coût des piles de threads natifs.
- **Localité de la mémoire et performances** : comprendre l'impact des modèles d'accès aux données sur les performances du processeur.
- Liaisons de service et états des processus: Comprendre l'impact des dépendances interprocessus sur les scores OOM.
- Dépannage à l'échelle du système : surveillance des PSI, LMK, de l'échange ZRAM et de l'éviction du cache de pages.
- Récupération de mémoire : éviction et échange : comprendre memcg,
la charge et la récupération proactive avec
memory.reclaim. - Interaction entre kswapd et lmkd: comprendre comment kswapd et lmkd fonctionnent ensemble sous pression.
Prérequis et environnement
Ce guide présente des workflows de référence, des données de référence et des études de cas illustrant comment diagnostiquer et résoudre les problèmes de mémoire Android.
- Outils d'analyse : les techniques décrites dans ce guide utilisent principalement des outils de performances Android standards, y compris Perfetto,
dumpsys meminfo,showmap, et AHAT. - Privilèges root : certains workflows de diagnostic au niveau du système (tels que
l'inspection de la pression de la mémoire du noyau ou des compteurs PMU matériels) nécessitent
des privilèges root élevés (
adb root) sur un appareil userdebug ou une compilation d'émulateur.
Commencer ici : Concepts fondamentaux