Dipende dalla tua definizione di quale query di memoria desideri ottenere.
Di solito, ti piacerebbe conoscere lo stato della memoria heap, poiché se utilizza troppa memoria, ottieni OOM e l'app si blocca.
Per questo, puoi controllare i seguenti valori:
final Runtime runtime = Runtime.getRuntime();
final long usedMemInMB=(runtime.totalMemory() - runtime.freeMemory()) / 1048576L;
final long maxHeapSizeInMB=runtime.maxMemory() / 1048576L;
final long availHeapSizeInMB = maxHeapSizeInMB - usedMemInMB;
Più la variabile "usedMemInMB" si avvicina a "maxHeapSizeInMB", più ci availHeapSizeInMB
si avvicina allo zero, più si avvicina l'OOM. (A causa della frammentazione della memoria, potresti ottenere OOM PRIMA che raggiunga lo zero.)
Questo è anche ciò che mostra lo strumento DDMS di utilizzo della memoria.
In alternativa, c'è il reale utilizzo della RAM, che è quanto utilizza l'intero sistema - vedi la risposta accettata per calcolarlo.
Aggiornamento: poiché Android O fa in modo che la tua app utilizzi anche la RAM nativa (almeno per l'archiviazione Bitmap, che di solito è il motivo principale per un enorme utilizzo della memoria), e non solo l'heap, le cose sono cambiate e ottieni meno OOM (perché il heap non contiene più bitmap, controlla qui ), ma dovresti comunque tenere d'occhio l'uso della memoria se sospetti di avere perdite di memoria. Su Android O, se hai perdite di memoria che avrebbero dovuto causare OOM su versioni precedenti, sembra che si bloccherà senza che tu sia in grado di rilevarlo. Ecco come verificare l'utilizzo della memoria:
val nativeHeapSize = Debug.getNativeHeapSize()
val nativeHeapFreeSize = Debug.getNativeHeapFreeSize()
val usedMemInBytes = nativeHeapSize - nativeHeapFreeSize
val usedMemInPercentage = usedMemInBytes * 100 / nativeHeapSize
Ma credo che potrebbe essere meglio usare il profiler dell'IDE, che mostra i dati in tempo reale, utilizzando un grafico.
Quindi la buona notizia su Android O è che è molto più difficile ottenere arresti anomali a causa di OOM di memorizzare troppe bitmap di grandi dimensioni, ma la cattiva notizia è che non penso sia possibile rilevare un caso del genere durante il runtime.
MODIFICA: sembra che Debug.getNativeHeapSize()
cambi nel tempo, in quanto ti mostra la memoria massima totale per la tua app. Quindi queste funzioni vengono utilizzate solo per il profiler, per mostrare quanto sta utilizzando la tua app.
Se vuoi ottenere la RAM nativa totale e disponibile reale, usa questo:
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()
.