120 votes

Comment obtenir l'utilisation actuelle de la mémoire dans Android ?

J'ai utilisé /proc/meminfo et analysé la réponse de la commande, mais le résultat montre que :

MemTotal : 94348 kB MemFree : 5784 kB

Il indique qu'il n'y a que 5 Mo de mémoire libre. Est-ce possible avec un mobile Android ? Il n'y a que 5-6 applications installées sur mon mobile et aucune autre tâche n'est en cours d'exécution. Mais cette commande montre qu'il y a très peu de mémoire libre.

Quelqu'un peut-il clarifier ce point ? ou existe-t-il un autre moyen d'obtenir l'utilisation de la mémoire dans Android ?

179voto

Badal Points 552

Merci. C'est fait et ça marche !

Je vais vous dire ce que j'ai fait, pour que les autres qui visitent ce fil puissent connaître les étapes :

  1. analyser la commande /proc/meminfo. Vous pouvez trouver le code de référence ici : Obtenir l'utilisation de la mémoire dans Android

  2. Utilisez le code ci-dessous et obtenez la RAM actuelle :

    MemoryInfo mi = new MemoryInfo();
    ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    activityManager.getMemoryInfo(mi);
    long availableMegs = mi.availMem / 1048576L;
    
    //Percentage can be calculated for API 16+
    long percentAvail = mi.availMem / mi.totalMem;

Explication du nombre 1048576

1024 bytes      == 1 kilobyte  
1024 kilobytes  == 1 megabyte  

1024 * 1024     == 1048576

Il est évident que ce nombre est utilisé pour convertir les octets en mégaoctets.

P.S : nous devons calculer la mémoire totale une seule fois. donc appelez le point 1 une seule fois dans votre code et ensuite, vous pouvez appeler le code du point 2 de façon répétitive.

106voto

android developer Points 20939

Cela dépend de votre définition de la requête mémoire que vous souhaitez obtenir.

En général, vous aimeriez connaître la situation de la mémoire du tas, car s'il y a trop de mémoire utilisée, vous obtiendrez un OOM et ferez planter l'application.

pour cela, vous pouvez vérifier les valeurs suivantes :

final Runtime runtime = Runtime.getRuntime();
final long usedMemInMB=(runtime.totalMemory() - runtime.freeMemory()) / 1048576L;
final long maxHeapSizeInMB=runtime.maxMemory() / 1048576L;

plus la variable "usedMemInMB" se rapproche de "maxHeapSizeInMB" , plus vous vous rapprochez de l'OOM .

C'est également ce que montre l'outil DDMS d'utilisation de la mémoire.

il y a aussi l'utilisation réelle de la RAM, qui correspond à la quantité de travail de l'ensemble du système.

31voto

Sharmilee Points 609

Une autre façon de calculer l'utilisation de la mémoire de l'application en cours d'exécution.

public static long getUsedMemorySize() {

    long freeSize = 0L;
    long totalSize = 0L;
    long usedSize = -1L;
    try {
        Runtime info = Runtime.getRuntime();
        freeSize = info.freeMemory();
        totalSize = info.totalMemory();
        usedSize = totalSize - freeSize;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return usedSize;

}

17voto

yanchenko Points 24142

Une autre façon de procéder (actuellement, mon G1 affiche 25 Mo gratuits) :

MemoryInfo mi = new MemoryInfo();
ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
activityManager.getMemoryInfo(mi);
long availableMegs = mi.availMem / 1048576L;

12voto

sarnold Points 62720

La philosophie de gestion de la mémoire de Linux est "La mémoire libre est de la mémoire gaspillée".

Je suppose que les deux lignes suivantes montreront combien de mémoire se trouve dans les "Buffers" et combien est en "Cached". Bien qu'il y ait une différence entre les deux (ne demandez pas quelle est cette différence :), elles correspondent toutes deux à la quantité de mémoire utilisée pour mettre en cache les données et les métadonnées des fichiers.

Un guide bien plus utile pour libérer de la mémoire sur un système Linux est le guide suivant free(1) sur mon bureau, il affiche des informations comme celles-ci :

$ free -m
             total       used       free     shared    buffers     cached
Mem:          5980       1055       4924          0         91        374
-/+ buffers/cache:        589       5391
Swap:         6347          0       6347

La ligne +/- buffers/cache : est la ligne magique, elle indique que j'ai réellement environ 589 mégaoctets de mémoire de processus activement requise, et environ 5391 mégaoctets de mémoire "libre", dans le sens où les 91+374 mégaoctets de mémoire tampon/cache peuvent être jetés si la mémoire peut être utilisée de manière plus profitable ailleurs.

(Ma machine est en marche depuis environ trois heures, ne faisant presque rien d'autre que du stackoverflow, ce qui explique pourquoi j'ai autant de mémoire libre).

Si Android n'est pas livré avec free(1) vous pouvez faire le calcul vous-même avec le /proc/meminfo j'aime bien le fichier free(1) format de sortie :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X