Dies hängt von Ihrer Definition ab, welche Speicherabfrage Sie erhalten möchten.
Normalerweise möchten Sie den Status des Heap-Speichers wissen, da Sie bei zu viel Speicher OOM erhalten und die App zum Absturz bringen.
Dazu können Sie die nächsten Werte überprüfen:
final Runtime runtime = Runtime.getRuntime();
final long usedMemInMB=(runtime.totalMemory() - runtime.freeMemory()) / 1048576L;
final long maxHeapSizeInMB=runtime.maxMemory() / 1048576L;
final long availHeapSizeInMB = maxHeapSizeInMB - usedMemInMB;
Je näher die Variable "usedMemInMB" an "maxHeapSizeInMB" heranrückt, desto näher availHeapSizeInMB kommt sie an Null, desto näher kommt OOM. (Aufgrund der Speicherfragmentierung erhalten Sie möglicherweise OOM, BEVOR dies Null erreicht.)
Das zeigt auch das DDMS-Tool zur Speichernutzung.
Alternativ gibt es die tatsächliche RAM-Auslastung, dh wie viel das gesamte System verbraucht - siehe akzeptierte Antwort, um dies zu berechnen.
Update: Da Android O Ihre App dazu bringt, auch den nativen Arbeitsspeicher (zumindest für den Bitmaps-Speicher, der normalerweise der Hauptgrund für die enorme Speichernutzung ist) und nicht nur den Heap zu verwenden, haben sich die Dinge geändert und Sie erhalten weniger OOM (weil der Der Heap enthält keine Bitmaps mehr (siehe hier ). Sie sollten jedoch die Speichernutzung im Auge behalten, wenn Sie den Verdacht haben, dass Speicherlecks vorliegen. Wenn Sie unter Android O Speicherlecks haben, die bei älteren Versionen zu OOM hätten führen sollen, scheint es, dass es nur abstürzt, ohne dass Sie es abfangen können. So überprüfen Sie die Speichernutzung:
val nativeHeapSize = Debug.getNativeHeapSize()
val nativeHeapFreeSize = Debug.getNativeHeapFreeSize()
val usedMemInBytes = nativeHeapSize - nativeHeapFreeSize
val usedMemInPercentage = usedMemInBytes * 100 / nativeHeapSize
Ich glaube jedoch, dass es am besten ist, den Profiler der IDE zu verwenden, der die Daten in Echtzeit mithilfe eines Diagramms anzeigt.
Die gute Nachricht für Android O ist, dass es aufgrund der OOM, zu viele große Bitmaps zu speichern, viel schwieriger ist, Abstürze zu bekommen, aber die schlechte Nachricht ist, dass ich nicht glaube, dass es möglich ist, einen solchen Fall zur Laufzeit zu erfassen.
EDIT: scheint Debug.getNativeHeapSize() sich im Laufe der Zeit zu ändern, da es Ihnen den maximalen Gesamtspeicher für Ihre App anzeigt. Diese Funktionen werden also nur für den Profiler verwendet, um zu zeigen, wie viel Ihre App verwendet.
Wenn Sie den tatsächlichen und verfügbaren nativen RAM erhalten möchten, verwenden Sie Folgendes:
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().