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
veux dire. cela montre qu'il n'y a que 5 Mo de mémoire libre. Est-ce possible avec Android mobile? 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 toujours qu'il y a très peu de mémoire libre.
Quelqu'un peut-il clarifier cela? ou y a-t-il un autre moyen d'utiliser la mémoire sous Android?
Debug.getNativeHeapFreeSize()
.Réponses:
ATTENTION: Cette réponse mesure l'utilisation de la mémoire / disponible du PÉRIPHÉRIQUE. Ce n'est PAS ce qui est disponible pour votre application. Pour mesurer ce que fait votre application et est AUTORISÉ à le faire, utilisez la réponse du développeur Android .
Documents Android - ActivityManager.MemoryInfo
parse / proc / meminfo commande. Vous pouvez trouver le code de référence ici: Obtenir l'utilisation de la mémoire dans Android
utilisez le code ci-dessous et obtenez la RAM actuelle:
Explication du nombre 0x100000L
Il est assez évident que le nombre est utilisé pour convertir des octets en mégaoctets
PS: nous n'avons besoin de calculer la mémoire totale qu'une seule fois. donc n'appelez le point 1 qu'une seule fois dans votre code, puis après, vous pouvez appeler le code du point 2 de manière répétitive.
la source
Cela dépend de votre définition de la requête mémoire que vous souhaitez obtenir.
Habituellement, vous souhaitez connaître l'état de la mémoire du tas, car si elle utilise trop de mémoire, vous obtenez un MOO et plantez l'application.
Pour cela, vous pouvez vérifier les valeurs suivantes:
Plus la variable "usedMemInMB" se rapproche de "maxHeapSizeInMB", plus
availHeapSizeInMB
se rapproche de zéro, plus vous vous rapprochez du MOO. (En raison de la fragmentation de la mémoire, vous pouvez obtenir OOM AVANT que cela n'atteigne zéro.)C'est aussi ce que montre l'outil DDMS d'utilisation de la mémoire.
Alternativement, il y a l'utilisation réelle de la RAM, qui est la quantité utilisée par le système entier - voir la réponse acceptée pour calculer cela.
Mise à jour: depuis Android O fait que votre application utilise également la RAM native (au moins pour le stockage Bitmaps, qui est généralement la principale raison de l'utilisation énorme de la mémoire), et pas seulement le tas, les choses ont changé et vous obtenez moins de MOO (car le heap ne contient plus de bitmaps, vérifiez ici ), mais vous devriez toujours garder un œil sur l'utilisation de la mémoire si vous pensez avoir des fuites de mémoire. Sur Android O, si vous avez des fuites de mémoire qui auraient dû provoquer un MOO sur les anciennes versions, il semble qu'il se plantera sans que vous puissiez l'attraper. Voici comment vérifier l'utilisation de la mémoire:
Mais je pense qu'il serait peut-être préférable d'utiliser le profileur de l'EDI, qui affiche les données en temps réel, à l'aide d'un graphique.
Donc, la bonne nouvelle sur Android O est qu'il est beaucoup plus difficile d'obtenir des plantages en raison du stockage de trop de bitmaps volumineux par MOO, mais la mauvaise nouvelle est que je ne pense pas qu'il soit possible de détecter un tel cas pendant l'exécution.
EDIT: semble
Debug.getNativeHeapSize()
changer au fil du temps, car il vous montre la mémoire maximale totale de votre application. Donc, ces fonctions ne sont utilisées que pour le profileur, pour montrer combien votre application utilise.Si vous souhaitez obtenir la RAM native totale réelle et disponible, utilisez ceci:
la source
Voici un moyen de calculer l'utilisation de la mémoire de l'application en cours d'exécution :
la source
Runtime.freeMemory()
renvoie 0 etRuntime.totalMemory()
renvoie uniquement la mémoire actuellement allouée.Une autre façon (montrant actuellement 25 Mo gratuits sur mon G1):
la source
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 prochaines lignes montreront la quantité de mémoire dans "Buffers" et la quantité de "Cached". Bien qu'il y ait une différence entre les deux (veuillez ne pas demander quelle est cette différence :), ils ajoutent tous les 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 la
free(1)
commande; sur mon bureau, il rapporte des informations comme celle-ci:La ligne +/- buffers / cache: est la ligne magique, elle rapporte que j'ai vraiment environ 589 Mo de mémoire de processus activement requise, et environ 5391 Mo de mémoire `` libre '', dans le sens où les 91 + 374 mégaoctets des tampons / mémoire cache peuvent être jetés si la mémoire peut être utilisée de manière plus rentable ailleurs.
(Ma machine a fonctionné pendant environ trois heures, ne faisant presque rien d'autre que stackoverflow, c'est 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
fichier; J'aime juste lefree(1)
format de sortie. :)la source
cat /proc/meminfo
plutôt le faire. C'est beaucoup plus détaillé, maisMemFree
.Buffers
, etCached
sont probablement les lignes les plus importantes.Je me réfère à quelques écrits.
référence:
Cette méthode getMemorySize () est renvoyée MemorySize qui a une taille de mémoire totale et libre.
Je ne crois pas parfaitement ce code.
Ce code teste sur LG G3 cat.6 (v5.0.1)
Je sais que Pattern.compile () coûte cher, vous pouvez donc déplacer son code vers un membre de classe.
la source
J'ai regardé l'arbre des sources Android.
À l'intérieur de com.android.server.am. ActivityManagerService.java (service interne exposé par android.app. ActivityManager ).
Dans android.os. Process.java
Il appelle la méthode JNI à partir de android_util_Process.cpp
Conclusion
MemoryInfo.availMem = MemFree + mis en cache dans / proc / meminfo.
Remarques
La mémoire totale est ajoutée au niveau d'API 16.
la source
vous pouvez également utiliser l'outil DDMS qui fait partie du SDK Android lui-même. il aide également à obtenir des allocations de mémoire de code java et de code c / c ++ natif.
la source
la source
C'est un code étrange. Il renvoie MaxMemory - (totalMemory - freeMemory). Si freeMemory vaut 0, alors le code renverra MaxMemory - totalMemory, donc il peut être supérieur ou égal à 0. Pourquoi freeMemory n'est-il pas utilisé?
la source
Voici une autre façon d'afficher l'utilisation de la mémoire de votre application:
Exemple de sortie:
Pour l'utilisation globale de la mémoire:
https://developer.android.com/studio/command-line/dumpsys#meminfo
la source