Quelle est la quantité maximale de RAM qu’une application peut utiliser?

Je suis assez curieux de cette question concernant la gestion de la mémoire du système d’exploitation Android, alors j’espère une réponse assez détaillée à ce sujet.

Ce que j’aimerais 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 at-il des différences entre les versions Android ?
  • Y at-il des différences concernant le fabricant de l’appareil?

Et, surtout:

  • Quels sont les “facteurs secondaires” pris en compte? De quoi dépend -il du système pour déterminer la quantité de mémoire vive qu’une application peut utiliser lors de l’exécution (en supposant que la mémoire maximale par application ne soit pas un nombre statique)?

Ce que j’ai entendu jusqu’ici (jusqu’en 2013):

  • Les premiers appareils Android avaient un plafond de 16 Mo par application
  • Plus tard, ce plafond a augmenté à 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 mémoire 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 mémoire vive, disons 32 Mo. Comment Android détermine-t-il combien de RAM une application peut utiliser? Comment est-il possible que les applications dépassent cette limite?

En outre, j’ai remarqué que certaines applications de la mine sont tombées en panne (tuées par le système?) Avec une exception OutOfMemoryException lorsque vous utilisez environ 30 à 40 mégaoctets. D’autre part, j’ai des applications fonctionnant sur mon téléphone en utilisant 100 Mo et plus après un certain temps (probablement en raison de memory leaks) qui ne se bloquent pas ou ne sont pas tués. Il est donc évident que cela dépend aussi de l’application ellemê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)

Merci d’avance pour vos explications.

Disclaimer: Je ne suis en aucun cas affilié à l’application Android Task Manager.

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?

Cela varie selon l’appareil. getMemoryClass() sur ActivityManager vous donnera la valeur de l’appareil sur lequel votre code s’exécute.

Y a-t-il des différences entre les versions Android?

Oui, dans la mesure où les exigences du système d’exploitation ont augmenté au fil des ans et que les appareils doivent s’adapter pour s’adapter.

Existe-t-il des différences concernant le fabricant de l’appareil?

Oui, dans la mesure où les fabricants fabriquent des appareils et que leur taille varie selon les appareils.

Quels sont les “facteurs secondaires” pris en compte pour déterminer la quantité de mémoire vive qu’une application peut utiliser?

Je n’ai aucune idée de ce que signifie “facteurs secondaires”.

Les premiers appareils avaient un plafond de 16 Mo par application; Les appareils ultérieurs ont augmenté à 24 Mo ou 32 Mo

C’est à peu près juste. La résolution de l’écran est un facteur déterminant, car des résolutions plus grandes signifient des images bitmap plus grandes, et les tablettes et les téléphones haute résolution auront donc tendance à avoir des valeurs plus élevées. Par exemple, vous verrez des périphériques avec des tas de 48 Mo, et je ne serais pas surpris s’il existe des valeurs plus élevées.

Comment est-il possible que les applications dépassent cette limite?

Vous supposez que l’auteur de cette application sait ce qu’il fait. Considérant que l’ utilisation de la mémoire d’une application est difficile à déterminer pour un ingénieur Android de base , je ne présume pas que l’application en question fournit nécessairement des résultats particulièrement précis.

Cela étant dit, le code natif (NDK) n’est pas soumis à la limite de segment de mémoire. Et, depuis Android 3.0, les applications peuvent demander un “gros tas”, généralement dans des centaines de Mo, mais cela est considéré comme une forme médiocre pour la plupart des applications.

En outre, j’ai remarqué que certaines applications du mien se sont brisées avec une exception OutOfMemoryException lors de l’utilisation d’environ 30 à 40 mégaoctets.

Gardez à l’esprit que le ramasse-miettes Android n’est pas un ramasse-miettes compacté. L’exception devrait vraiment être CouldNotFindSufficientlyLargeBlockOfMemoryException , mais cela a probablement été jugé trop verbeux. OutOfMemoryException signifie que vous ne pouvez pas allouer votre bloc demandé , pas que vous ayez complètement épuisé votre tas.

Les limites de mémoire par application sont ici en fonction de la taille de l’écran et de la version 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), compatibilité de machine virtuelle de section ou compatibilité d’exécution