Je suis assez curieux de connaître cette question concernant la gestion de la mémoire du système d'exploitation Android et j'espère donc une réponse assez détaillée à ce sujet.
Ce que je voudrais savoir:
- Quelle est la quantité maximale de mémoire (en mégaoctets / en pourcentage de la RAM totale) qu'une application Android (qui n'est pas une application système) peut utiliser?
- Y a-t-il des différences entre les versions d'Android ?
- Y a-t-il des différences concernant le fabricant de l'appareil?
Et, surtout:
- Qu'est - ce qui est considéré / de quoi dépend -il quand il s'agit de déterminer la quantité de RAM qu'une application peut utiliser au moment de l'exécution (en supposant que la mémoire maximale par application n'est pas un nombre statique)?
Ce que j'ai entendu jusqu'à présent (jusqu'en 2013):
- Les premiers appareils Android avaient une limite par application de 16 Mo
- Plus tard, ce plafond est passé à 24 Mo ou 32 Mo
Ce qui me rend très curieux:
Ces deux limites sont très faibles.
Je viens de télécharger le gestionnaire de tâches Android pour vérifier la RAM de mes appareils. Ce que j'ai remarqué, c'est qu'il existe des applications utilisant environ 40 à 50 mégaoctets de RAM, ce qui est évidemment plus que l'utilisation maximale de RAM mentionnée, disons 32 Mo. Alors, comment Android détermine-t-il la quantité de RAM qu'une application peut utiliser? Comment est-il possible que les applications dépassent cette limite?
De plus, j'ai remarqué que certaines de mes applications se bloquent (tuées par le système?) Avec une OutOfMemoryException lors de l'utilisation d'environ 30 à 40 mégaoctets. D'un autre côté, j'ai des applications exécutées sur mon téléphone en utilisant 100 Mo et plus après un certain temps (probablement en raison de fuites de mémoire) qui ne se bloquent pas ou ne sont pas tuées. Donc, cela dépend évidemment aussi de l'application elle - même lorsqu'il s'agit de déterminer la quantité de RAM pouvant être épargnée. Comment est-ce possible? (J'ai effectué mes tests avec un HTC One S avec 768 Mo de RAM)
Clause de non-responsabilité: je ne suis en aucun cas affilié à l'application Android Task Manager.
la source
C'est la fin de 2018 donc les choses ont changé.
Tout d'abord: exécutez votre application et ouvrez l'onglet Android Profiler dans Android Studio. Vous verrez combien de mémoire il consomme, vous serez surpris mais il peut allouer beaucoup de RAM.
Voici également un excellent article dans la documentation officielle avec des instructions détaillées sur l'utilisation de Memory Profiler qui peuvent vous donner un aperçu détaillé de la gestion de votre mémoire.
Mais dans la plupart des cas, votre profileur Android régulier vous suffira.
Habituellement, une application commence avec 50 Mo d'allocation de RAM, mais passe instantanément à 90 Mo lorsque vous commencez à charger des photos en mémoire. Lorsque vous ouvrez Activity avec un ViewPager avec des photos préchargées (3,5 Mo chacune), vous pouvez facilement obtenir 190 Mo en quelques secondes.
Mais cela ne signifie pas que vous avez des problèmes avec la gestion de la mémoire.
Le meilleur conseil que je puisse donner est de suivre les directives et les meilleures pratiques, d'utiliser les meilleures bibliothèques pour le chargement d'images (Glide, Picasso) et tout ira bien.
Mais si vous avez besoin de personnaliser quelque chose et que vous avez vraiment besoin de savoir combien de mémoire vous pouvez allouer manuellement, vous pouvez obtenir la mémoire totale disponible et en calculer une partie prédéterminée (en%). Dans mon cas, j'avais besoin de mettre en cache les photos déchiffrées en mémoire afin de ne pas avoir besoin de les déchiffrer à chaque fois que l'utilisateur glisse dans la liste.
Pour cela, vous pouvez utiliser la classe LruCache prête à l'emploi . C'est une classe de cache qui suit automatiquement la quantité de mémoire allouée par vos objets (ou le nombre d'instances) et supprime la plus ancienne pour conserver la plus récente par leur historique d'utilisation. Voici un excellent tutoriel sur la façon de l'utiliser.
Dans mon cas, j'ai créé 2 instances de caches: pour les pouces et les pièces jointes. Rendez-les statiques avec un accès unique afin qu'ils soient disponibles dans le monde entier dans toute l'application.
classe de cache:
Voici comment je calcule la RAM libre disponible et combien je peux en tirer:
Et voici comment je l'utilise dans Adapters pour obtenir une image en cache:
et comment je l'ai mis en cache dans le thread d'arrière-plan (AsyncTask normal):
Mon application cible l'API 19+, donc les appareils ne sont pas vieux et ces portions de RAM disponible sont assez bonnes pour le cache dans mon cas (1% et 3%).
Fait amusant: Android ne possède pas d'API ou d'autres hacks pour obtenir la quantité de mémoire allouée à votre application, elle est calculée à la volée en fonction de divers facteurs.
PS J'utilise un champ de classe statique pour contenir un cache, mais selon les dernières directives Android, il est recommandé d'utiliser le composant d'architecture ViewModel à cette fin.
la source
Les limites de mémoire par application dépendent de la taille de l'écran et de la version d'Android: https://drive.google.com/file/d/0B7Vx1OvzrLa3Y0R0X1BZbUpicGc/view?usp=sharing
Source: Téléchargements de compatibilité Android http://source.android.com/compatibility/downloads.html ; Document de définition de compatibilité (CDD), section Compatibilité de la machine virtuelle ou compatibilité d'exécution
la source