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:
final Runtime runtime = Runtime.getRuntime();
final long usedMemInMB=(runtime.totalMemory() - runtime.freeMemory()) / 1048576L;
final long maxHeapSizeInMB=runtime.maxMemory() / 1048576L;
final long availHeapSizeInMB = maxHeapSizeInMB - usedMemInMB;
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:
val nativeHeapSize = Debug.getNativeHeapSize()
val nativeHeapFreeSize = Debug.getNativeHeapFreeSize()
val usedMemInBytes = nativeHeapSize - nativeHeapFreeSize
val usedMemInPercentage = usedMemInBytes * 100 / nativeHeapSize
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:
val memoryInfo = ActivityManager.MemoryInfo()
(getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager).getMemoryInfo(memoryInfo)
val nativeHeapSize = memoryInfo.totalMem
val nativeHeapFreeSize = memoryInfo.availMem
val usedMemInBytes = nativeHeapSize - nativeHeapFreeSize
val usedMemInPercentage = usedMemInBytes * 100 / nativeHeapSize
Log.d("AppLog", "total:${Formatter.formatFileSize(this, nativeHeapSize)} " +
"free:${Formatter.formatFileSize(this, nativeHeapFreeSize)} " +
"used:${Formatter.formatFileSize(this, usedMemInBytes)} ($usedMemInPercentage%)")
Debug.getNativeHeapFreeSize()
.