Depende de su definición de la consulta de memoria que desee obtener.
Por lo general, le gustaría saber el estado de la memoria del montón, ya que si usa demasiada memoria, obtiene OOM y bloquea la aplicación.
Para ello, puede comprobar los siguientes 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;
Cuanto más se acerca la variable "usedMemInMB" a "maxHeapSizeInMB", cuanto más availHeapSizeInMB
se acerca a cero, más se acerca a OOM. (Debido a la fragmentación de la memoria, es posible que obtenga OOM ANTES de que llegue a cero).
Eso es también lo que muestra la herramienta DDMS de uso de memoria.
Alternativamente, existe el uso real de RAM, que es la cantidad que usa todo el sistema; consulte la respuesta aceptada para calcular eso.
Actualización: dado que Android O hace que su aplicación también use la RAM nativa (al menos para el almacenamiento de Bitmaps, que suele ser la razón principal del gran uso de memoria), y no solo el montón, las cosas han cambiado y obtiene menos OOM (porque el heap ya no contiene mapas de bits, verifique aquí ), pero aún debe estar atento al uso de la memoria si sospecha que tiene pérdidas de memoria. En Android O, si tiene pérdidas de memoria que deberían haber causado OOM en versiones anteriores, parece que simplemente fallará sin que pueda detectarlo. A continuación, le indicamos cómo verificar el uso de la memoria:
val nativeHeapSize = Debug.getNativeHeapSize()
val nativeHeapFreeSize = Debug.getNativeHeapFreeSize()
val usedMemInBytes = nativeHeapSize - nativeHeapFreeSize
val usedMemInPercentage = usedMemInBytes * 100 / nativeHeapSize
Pero creo que podría ser mejor usar el generador de perfiles del IDE, que muestra los datos en tiempo real, usando un gráfico.
Entonces, la buena noticia en Android O es que es mucho más difícil tener bloqueos debido a que OOM almacena demasiados mapas de bits grandes, pero la mala noticia es que no creo que sea posible detectar un caso así durante el tiempo de ejecución.
EDITAR: parece Debug.getNativeHeapSize()
cambia con el tiempo, ya que le muestra la memoria máxima total para su aplicación. Entonces, esas funciones se usan solo para el generador de perfiles, para mostrar cuánto está usando su aplicación.
Si desea obtener la RAM nativa total y disponible real, use esto:
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()
.