Utilisation de la mémoire (RSS anonyme + espace)

L'utilisation de la mémoire (RSS anonyme + espace d'échange) est une métrique Android Vitals qui reflète l'utilisation de la mémoire par votre application.

La mémoire anonyme est une mémoire non sauvegardée par un fichier de stockage, comme les allocations de tas et la mémoire allouée par mmap. Cela capture les allocations de mémoire dynamiques de votre application, y compris le tas de mémoire Java ou Kotlin, les allocations de tas de mémoire natif non gérées (où les données de pixels bitmap sont stockées sur Android 8.0 (niveau d'API 26) et versions ultérieures) et les piles d'exécution des threads. Bien que l'OS puisse supprimer la mémoire associée à des fichiers en cas de pression, il ne peut pas supprimer la mémoire anonyme.

La taille de l'ensemble résident (RSS, Resident Set Size) correspond au nombre total de pages mémoire (partagées et non partagées) utilisées par un processus et conservées dans la RAM physique. Une page est considérée comme "partagée" si elle est consultée par plusieurs processus (par exemple, des applications qui accèdent à la même bibliothèque).

Pour la mémoire anonyme, le système peut écrire des pages dans l'espace d'échange (ou zRAM sur Android) lorsque la mémoire est sollicitée. Le système peut relire ces pages à partir de l'espace d'échange si nécessaire.

Globalement, l'utilisation de la mémoire (RSS anonyme + swap) est une mesure du nombre total de pages de mémoire de votre application qui ne sont pas sauvegardées dans un fichier de stockage, y compris toute mémoire qui est également conservée par le système dans le swap. Le suivi anonyme RSS + swap vous permet de voir l'espace mémoire utilisé réel et non expulsable de votre application.

Si l'utilisation de la mémoire de votre application est élevée, examinez le problème plus en détail et résolvez-le en suivant les instructions de cette page.

Identifier l'utilisation élevée de la mémoire

Android Vitals

Android Vitals indique l'utilisation de la mémoire de votre application en fonction des états de processus suivants :

  • Premier plan : le processus de l'application est visible. Un P99 élevé affecte souvent les performances perçues par l'utilisateur (à-coups ou plantages OOM) et est fortement lié à la conservation de composants ou d'activités d'UI qui ne sont plus nécessaires.
  • Service perceptible : le processus de l'application s'exécute dans un état perceptible. Cela inclut les services de premier plan, les tâches accélérées et les tâches de transfert de données déclenchées par l'utilisateur. Cela peut également s'étendre aux services liés au système ou aux services liés à d'autres applications. Étant donné que ces services sont conçus pour les tâches de longue durée, la conservation de la mémoire en raison de fuites ou le non-respect de la libération des ressources peuvent gonfler la queue P99 au fil du temps.
  • Arrière-plan : l'application exécute un service d'arrière-plan ou a récemment été mise en arrière-plan, mais n'est pas encore mise en cache. C'est là que les fuites de traitement en arrière-plan et les ressources non libérées peuvent s'accumuler. Étant donné que cet état de processus est moins important que les processus de premier plan ou perceptibles, essayez d'éviter de conserver de grandes quantités de mémoire dans cet état.
  • En cache : l'application est en cache. Cet état est très sensible à la pression exercée sur la mémoire système, comme les arrêts pour cause de mémoire insuffisante. Étant donné que l'OS peut expulser cet état de processus à volonté, cet état n'est fourni qu'à des fins de débogage.

Pour comprendre comment ces états de processus sont corrélés aux rappels onTrimMemory, consultez les conseils sur la libération de la mémoire en fonction d'événements.

Android Vitals décompose également l'utilisation de la mémoire de votre application par groupes de RAM. La métrique sur l'utilisation de la mémoire s'affiche sous la forme d'un graphique chronologique des valeurs de centiles quotidiens, ainsi que la valeur quotidienne la plus récente pour les 50e et 90e centiles.

Une fois que vous avez identifié votre référence de mémoire, suivez les conseils pour diagnostiquer et améliorer l'utilisation excessive de la mémoire.

Identifier les fuites de mémoire à l'aide du skew de queue

Pour identifier les fuites de mémoire, recherchez une divergence entre vos utilisateurs typiques (P50) et vos utilisateurs de fin de spectre (P90) dans Android Vitals. Alors que le gonflement général des ressources augmente la mémoire de manière uniforme sur tous les centiles, les fuites de mémoire s'accumulent au fil du temps, ce qui fausse fortement les données de fin de queue.

Vous devez comparer vos métriques P90 et P99 à votre référence P50 par nom de processus. Si votre ratio P90/P50 dépasse 3,5, cela indique une fuite de mémoire probable lors des sessions prolongées. Dans certains cas d'utilisation, un ratio élevé n'indique pas toujours une fuite. Toutefois, vous devez évaluer le workflow spécifique pour déterminer si l'utilisation élevée de la mémoire est un comportement attendu.

Ressources

Diagnostiquer une utilisation excessive de la mémoire en local

Pour commencer à diagnostiquer la source d'une utilisation excessive de la mémoire, vous pouvez capturer une empreinte de la mémoire avec Enregistrer l'empreinte de la mémoire dans les paramètres du développeur, Android Studio ou Perfetto. Nous vous recommandons de commencer par capturer un vidage de tas en local après avoir testé les principaux parcours utilisateur de votre application.

Nous vous recommandons tout particulièrement de tester les parcours utilisateur suivants :

  • WebViews et sessions de navigateur intégré dans l'application
  • Défilement infini avec de nombreux éléments multimédias
  • Flux de création et de modification de composants

Pour examiner les éventuelles fuites de mémoire, commencez par identifier les processus les plus gourmands à l'aide du tableau Nom du processus dans le tableau de bord Android Vitals sur l'utilisation de la mémoire. Ensuite, exécutez les parcours utilisateur correspondants en local et collectez les vidages de tas dans différents états de processus (visible, service de premier plan et mis en cache) pour vérifier si l'application libère de la mémoire après avoir été mise en arrière-plan.

Si vous déboguez des problèmes de mémoire à l'aide du Profileur Android Studio, vous pouvez également utiliser l'intégration LeakCanary pour simplifier la détection des fuites et des bitmaps en double afin d'optimiser votre utilisation des images.

Une fois l'empreinte de la mémoire collectée, nous vous recommandons d'utiliser les compétences Perfetto AI pour l'analyser et identifier les sources potentielles d'utilisation élevée de la mémoire.

Voici un exemple de réponse que les compétences d'IA pourraient fournir :

I have completed the analysis of memory leaks and bitmap issues for [app] using the provided Perfetto trace.
  Summary of Findings
  The investigation identified a critical memory pressure issue caused by massive bitmap retention within the app process.
...
Recommendations for [app]
   1. [Library] Image Cache Optimization:
       * Review the [Library] caching strategy. Ensure that bitmaps
         loaded for animations are released or downsampled when the animation is
         not in the foreground.
   2. Asset Resolution Audit:
       * The 14.7 MB average size suggests full-screen or extremely high-density assets. Audit the [library] files in the native_home component to ensure they are not using unnecessarily large source images.
   3. View Lifecycle Management:
       * Investigate why 21 [LibraryImage] instances are alive simultaneously. Ensure that views in the bottom
      tab are properly detached or their animations are cleared when switching between tabs.
   4. Fix Surface Leaks:
       * Address the Surface.release failures observed in the logs, as these can lead to both memory leaks and
         native resource exhaustion.

Ressources supplémentaires pour interpréter les vidages de tas

Les ressources suivantes fournissent plus d'informations sur l'interprétation des vidages de tas et le débogage de l'utilisation de la mémoire :

Améliorer l'utilisation de la mémoire

Consultez ces sections pour savoir comment améliorer l'utilisation de la mémoire de votre application :

Pour obtenir des conseils détaillés sur la résolution des problèmes de mémoire, consultez le guide Gérer la mémoire de votre application.