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 Android).
Le processus du 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 arrêtant les processus les moins essentiels pour maintenir les performances du système à un niveau acceptable.
Pour identifier le processus à arrêter, le démon LMK 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, et les processus système en dernier. 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 trouver 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 de mémoire et la saturation de la mémoire qui peuvent entraîner des saccades, des blocages, voire des plantages d'applications. 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 conseils de profilage de la mémoire Unity. Unity propose deux outils pour analyser l'utilisation de la mémoire dans votre application.
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, qui est un package Unity que vous pouvez ajouter à votre projet. Le package ajoute une fenêtre Profileur de mémoire 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 afin de trouver les problèmes de fragmentation de la mémoire.
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és aux blocs de mémoire.
Le système de requête Memory Insights peut trouver des allocations en direct à tout moment, identifier les changements dans l'utilisation de la mémoire, localiser les fuites de mémoire et différencier les allocations à court terme de celles à 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.
Insights sur la mémoire faible
Android fournit des rappels et des API qui vous permettent de réduire les besoins en mémoire de votre jeu et de déterminer pourquoi les exécutions précédentes du jeu ont été interrompues.
Rappels
N'enregistrez pas les rappels trim obsolètes. Android ne dispose d'aucune API permettant de détecter les événements de pression de mémoire native lorsque le système atteint les limites de mémoire.
Les rappels de réduction n'ont pas permis d'éviter les arrêts pour mémoire insuffisante. Android a donc tous les abandonnés, à l'exception de TRIM_MEMORY_UI_HIDDEN et TRIM_MEMORY_BACKGROUND.
Fin de la partie
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 quelques informations, insights et bonnes pratiques qui vous aideront à mieux gérer l'utilisation de la mémoire de votre jeu :
- Utilisez
ApplicationExitInfo: cette API renvoie la raison pour laquelle l'exécution du jeu précédent a été arrêtée par le système Android. UtilisezApplicationExitInfopour vérifier si la mémoire insuffisante est la cause d'un arrêt d'exécution de processus précédent. Vérifiez si le jeu a été arrêté en raison d'une mémoire insuffisante 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 correspondre aux capacités de l'appareil, examinez la RAM physique totale par appareil pour ajuster précisément l'utilisation de la mémoire du jeu en fonction de cela. Si l'objectif est d'empêcher la fermeture des applications peu de temps après leur passage en arrière-plan (pour permettre au joueur d'effectuer plusieurs tâches à la fois), utilisez les rappels trim (
TRIM_MEMORY_UI_HIDDENen particulier) pour réduire l'utilisation de la mémoire de votre jeu.