Le daemon LMK (Low Memory Killer) d'Android surveille l'état de la mémoire d'un système Android en cours d'exécution et réagit à une forte pression sur la mémoire en mettant fin aux processus les moins essentiels. Android Vitals suit et signale les arrêts LMK perçus par l'utilisateur dans la Google Play Console pour vous aider à identifier les problèmes de pression sur la mémoire qui affectent vos utilisateurs.
Métrique LMK sur Android Vitals
Android Vitals vous permet de surveiller et d'améliorer le taux de LMK de votre application. Android Vitals ne mesure qu'un seul taux de LMK : le taux de LMK perçus par l'utilisateur.
Cette métrique reflète le pourcentage de vos utilisateurs actifs par jour ayant perçu au moins un LMK. Un LMK dit "perçu par l'utilisateur" signifie que l'utilisateur l'a probablement remarqué. Il peut s'agir, par exemple, de LMK quand votre appli affiche une activité ou s'exécute en tant que service de premier plan. Ces arrêts entraînent une sortie immédiate et non progressive du processus. Pour l'utilisateur final, l'application semble avoir planté, ce qui contourne souvent les mécanismes standards d'enregistrement de l'état du cycle de vie et entraîne la perte de la progression de l'utilisateur.
Android Vitals se concentre sur ces arrêts de processus, car ils servent de proxy haute fidélité pour les problèmes de mauvaise gestion de la mémoire. Un taux de LMK supérieur à 1 % indique un besoin critique d'action immédiate. Toutefois, un taux de LMK plus faible ne signifie pas nécessairement que l'utilisation de la mémoire de l'application est saine. Ce taux inférieur peut signifier que le daemon LMK supprime fréquemment des processus lorsqu'ils sont en arrière-plan, ce qui dégrade les performances de "démarrage à chaud" et la fluidité du multitâche.
Vous trouverez cette métrique dans la section Stabilité d'Android Vitals :
Comme pour les autres statistiques principales Android Vitals, telles que les ANR et les plantages, vous pouvez filtrer les métriques, les comparer à celles de vos pairs ou surveiller leur évolution sur une longue période (jusqu'à trois ans). Les données sont disponibles pour les applications existantes à partir du 28 janvier 2025.
Fonctionnement du daemon Low Memory Killer
La plate-forme Android part du principe que la mémoire disponible est une mémoire gaspillée. Android tente d'utiliser toute la mémoire disponible en permanence. Par exemple, le système conserve les applications en mémoire après leur fermeture, afin que l'utilisateur puisse y revenir rapidement. C'est pourquoi les appareils Android s'exécutent souvent avec très peu de mémoire libre (voir Allocation de mémoire entre les processus).
Pour identifier le processus à arrêter lorsque la mémoire disponible est faible, le daemon LMK (Low Memory Killer) utilise un score de mémoire insuffisante appelé oom_adj_score afin de hiérarchiser les processus en cours d'exécution. Les processus avec un score élevé sont arrêtés en premier. Les applications en arrière-plan sont supprimées en premier, puis les processus système en fin de vie. Le tableau suivant recense les catégories de score LMK, du plus élevé au plus bas.
Les éléments de la catégorie ayant obtenu le meilleur score, à la ligne 1, sont supprimés en premier :
Outils de profilage de la mémoire
Les outils suivants peuvent vous aider à identifier et à diagnostiquer les problèmes de mémoire de différentes manières :
- Découvrez comment votre application alloue de la mémoire au fil du temps. Vous pouvez consulter un graphique en temps réel de la quantité de mémoire utilisée par votre application, du nombre d'objets Java alloués et de la récupération de mémoire.
- Lancez des événements de récupération de mémoire et prenez un instantané du tas de mémoire Java pendant l'exécution de votre application.
- Enregistrez les allocations de mémoire de votre application, inspectez tous les objets alloués et affichez la trace de la pile pour chaque allocation.
Si votre jeu s'exécute sur un moteur natif, utilisez HWAddress Sanitizer pour déboguer l'allocation de mémoire native.
Profileur de mémoire Android Studio
Android Studio fournit le Profileur de mémoire en tant que composant du Profileur Android. Il vous aide à identifier les fuites et la saturation de la mémoire qui peuvent entraîner des saccades, des blocages, voire des plantages de l'application. Le profileur affiche un graphique en temps réel de l'utilisation de la mémoire de votre application, et vous permet de capturer une empreinte de la mémoire, de forcer la récupération de mémoire et de suivre l'allocation de mémoire.
Outils de profilage de la mémoire Unity
Si vous utilisez Unity Engine pour créer vos applications, vous pouvez suivre les instructions de profilage de la mémoire Unity. Unity propose deux outils pour analyser l'utilisation de la mémoire dans votre application Unity.
Le premier est le module Profileur de mémoire, un profileur intégré qui vous fournit des informations de base sur l'utilisation de la mémoire par votre application.
Le deuxième outil est le package Profileur de mémoire, un package Unity que vous pouvez ajouter à votre projet. Le package ajoute une fenêtre Memory Profiler supplémentaire à l'éditeur Unity. Le Profileur de mémoire vous permet d'analyser l'utilisation de la mémoire dans votre application de manière encore plus détaillée. Vous pouvez stocker et comparer des instantanés pour détecter les fuites de mémoire ou afficher la disposition de la mémoire pour identifier les problèmes de fragmentation de la mémoire.
Pour les workflows Unity spécifiques à Android, consultez Vérifier l'utilisation de la mémoire avec les outils Unity, Optimiser l'utilisation de la mémoire dans Unity et Déboguer les LMK pour les jeux Unity.
Unreal Memory Insights
Les applications créées par Unreal Engine peuvent utiliser Unreal Memory Insights pour afficher des informations détaillées sur l'allocation et la désallocation de mémoire, y compris les tags LLM (Low Level Memory) et les piles d'appels associées aux blocs de mémoire.
Le système de requêtes Memory Insights peut trouver des allocations actives à tout moment, identifier les changements d'utilisation de la mémoire, localiser les fuites de mémoire et différencier les allocations à court terme des allocations à long terme.
À partir d'UE 5.4, Memory Insights est compatible avec le traçage de la mémoire avec des piles d'appels pour les projets Android.
Pour en savoir plus sur les workflows Unreal spécifiques à Android, consultez Vérifier l'utilisation de la mémoire avec Unreal et Optimiser l'utilisation de la mémoire dans Unreal.
Insights sur la mémoire faible
Android fournit des rappels et des API qui vous permettent de réduire l'utilisation de la mémoire de votre jeu et de déterminer pourquoi les exécutions précédentes du jeu ont été arrêtées.
Rappels
N'enregistrez pas de rappels trim obsolètes. Android ne fournit pas d'API permettant de détecter les événements de pression de la mémoire native avant que le système ne récupère de la mémoire, et les rappels de réduction de la mémoire d'exécution (TRIM_MEMORY_RUNNING_*) n'ont pas permis d'éviter les arrêts pour mémoire insuffisante.
Par conséquent, Android a abandonné tous les niveaux de réduction autres que TRIM_MEMORY_UI_HIDDEN et TRIM_MEMORY_BACKGROUND. Utilisez ces rappels restants (ou les équivalents du cycle de vie du moteur, tels que OnApplicationPause d'Unity et ApplicationWillEnterBackgroundDelegate d'Unreal) pour libérer l'interface utilisateur et les ressources auxiliaires lorsque votre jeu passe en arrière-plan. Pour en savoir plus sur l'implémentation, consultez Réduire la mémoire dans les jeux.
La fermeture du jeu
Android tente d'utiliser toute la mémoire disponible pour mettre en cache les applications et les jeux afin de s'assurer qu'ils se chargent rapidement (ce qui améliore l'expérience utilisateur). Toutefois, lorsque la mémoire devient limitée, le système arrête les applications et les jeux les plus gourmands en mémoire pour libérer de la mémoire pour le fonctionnement normal de l'appareil.
Voici des informations, des insights et des bonnes pratiques pour vous aider à optimiser l'utilisation de la mémoire de votre jeu :
- Utilisez
ApplicationExitInfo: cette API renvoie la raison pour laquelle l'exécution précédente du jeu a été interrompue par le système Android. UtilisezApplicationExitInfopour vérifier si une mémoire faible (REASON_LOW_MEMORY) ou des arrêts du limiteur de mémoire (REASON_MEMORY_LIMITER) sont à l'origine d'une fermeture de processus précédente (voir ApplicationExitInfo pour les jeux). Vérifiez si le jeu a été arrêté en raison d'une sollicitation de la mémoire, afin de pouvoir l'optimiser pour qu'il utilise moins de mémoire sur cet appareil. - Examinez la RAM physique totale : pour éviter que les jeux ne soient arrêtés lorsqu'ils sont au premier plan et pour les adapter aux capacités de l'appareil, examinez la RAM physique totale par appareil afin d'ajuster l'utilisation de la mémoire du jeu en conséquence. Si l'objectif est d'éviter que les applications soient arrêtées peu de temps après être passées en arrière-plan (pour permettre au joueur d'effectuer plusieurs tâches à la fois), utilisez les rappels trim (
TRIM_MEMORY_UI_HIDDENspécifiquement) pour réduire l'utilisation de la mémoire de votre jeu.
Ressources supplémentaires
- À propos de la gestion de la mémoire pour les jeux
- Surveiller l'utilisation de la mémoire dans les jeux
- Réduire l'utilisation de la mémoire dans les jeux
- Présentation de la gestion de la mémoire