Depende da sua definição de qual consulta de memória você deseja obter.
Normalmente, você gostaria de saber o status da memória heap, uma vez que se ela usar muita memória, você obtém OOM e falha o aplicativo.
Para isso, você pode verificar os próximos valores:
final Runtime runtime = Runtime.getRuntime();
final long usedMemInMB=(runtime.totalMemory() - runtime.freeMemory()) / 1048576L;
final long maxHeapSizeInMB=runtime.maxMemory() / 1048576L;
final long availHeapSizeInMB = maxHeapSizeInMB - usedMemInMB;
Quanto mais a variável "usedMemInMB" se aproxima de "maxHeapSizeInMB", quanto mais perto availHeapSizeInMB
chega de zero, mais perto você obtém OOM. (Devido à fragmentação da memória, você pode obter OOM ANTES de chegar a zero.)
Isso também é o que mostra a ferramenta DDMS de uso de memória.
Alternativamente, existe o uso real de RAM, que é quanto todo o sistema usa - veja a resposta aceita para calcular isso.
Atualização: como o Android O faz seu aplicativo também usar a RAM nativa (pelo menos para armazenamento de bitmaps, que geralmente é o principal motivo para o uso excessivo de memória), e não apenas o heap, as coisas mudaram e você obtém menos OOM (porque o heap não contém mais bitmaps, verifique aqui ), mas você ainda deve ficar de olho no uso da memória se suspeitar que há vazamentos de memória. No Android O, se você tiver vazamentos de memória que deveriam ter causado OOM em versões mais antigas, parece que ele irá travar sem que você consiga detectá-lo. Veja como verificar o uso de memória:
val nativeHeapSize = Debug.getNativeHeapSize()
val nativeHeapFreeSize = Debug.getNativeHeapFreeSize()
val usedMemInBytes = nativeHeapSize - nativeHeapFreeSize
val usedMemInPercentage = usedMemInBytes * 100 / nativeHeapSize
Mas acredito que seja melhor usar o profiler do IDE, que mostra os dados em tempo real, usando um gráfico.
Portanto, a boa notícia no Android O é que é muito mais difícil travar devido ao OOM de armazenar muitos bitmaps grandes, mas a má notícia é que não acho que seja possível detectar tal caso durante o tempo de execução.
EDIT: parece Debug.getNativeHeapSize()
mudar com o tempo, pois mostra a memória máxima total para seu aplicativo. Portanto, essas funções são usadas apenas para o criador de perfil, para mostrar o quanto seu aplicativo está usando.
Se você deseja obter o total real e a RAM nativa disponível, use:
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()
.