Comprendre et résoudre les problèmes de mémoire Android

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 meminfo et showmap pour é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 heapprofd pour 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 :

  1. Concepts fondamentaux : principes techniques de base de la mémoire Android.
  2. Outils d'évaluation rapide : utilisation de meminfo, showmap, et procstats pour un tri rapide.
  3. Analyse de la mémoire Java : exploration approfondie du tas Java avec AHAT.
  4. Bitmaps et mémoire : comprendre l'impact des images sur la RAM et utiliser des outils pour les profiler.
  5. Analyse de la mémoire native : profilage de la mémoire C/C++ avec Perfetto et heapprofd.
  6. WebView et espace mémoire utilisé : comprendre l'architecture multiprocessus et l'espace mémoire utilisé des WebView.
  7. Le code d'application est de la mémoire : comprendre l'impact du chargement de classe et du gonflement dex sur la RAM.
  8. Threads et mémoire : analyse du coût des piles de threads natifs.
  9. **Localité de la mémoire et performances** : comprendre l'impact des modèles d'accès aux données sur les performances du processeur.
  10. Liaisons de service et états des processus: Comprendre l'impact des dépendances interprocessus sur les scores OOM.
  11. Dépannage à l'échelle du système : surveillance des PSI, LMK, de l'échange ZRAM et de l'éviction du cache de pages.
  12. Récupération de mémoire : éviction et échange : comprendre memcg, la charge et la récupération proactive avec memory.reclaim.
  13. 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