Zależy to od definicji zapytania pamięci, które chcesz uzyskać.
Zwykle chcesz poznać stan pamięci sterty, ponieważ jeśli zużywa ona zbyt dużo pamięci, pojawia się OOM i powoduje awarię aplikacji.
W tym celu możesz sprawdzić kolejne wartości:
final Runtime runtime = Runtime.getRuntime();
final long usedMemInMB=(runtime.totalMemory() - runtime.freeMemory()) / 1048576L;
final long maxHeapSizeInMB=runtime.maxMemory() / 1048576L;
final long availHeapSizeInMB = maxHeapSizeInMB - usedMemInMB;
Im bardziej zmienna „usedMemInMB” zbliża się do wartości „maxHeapSizeInMB”, tym bliżej availHeapSizeInMB
zera, tym bliżej jest OOM. (Z powodu fragmentacji pamięci możesz dostać OOM, ZANIM to osiągnie zero.)
To również pokazuje narzędzie DDMS do wykorzystania pamięci.
Alternatywnie, istnieje rzeczywiste użycie pamięci RAM, czyli ile zużywa cały system - zobacz zaakceptowaną odpowiedź, aby to obliczyć.
Aktualizacja: ponieważ Android O sprawia, że twoja aplikacja korzysta również z natywnej pamięci RAM (przynajmniej do przechowywania map bitowych, co jest zwykle głównym powodem dużego zużycia pamięci), a nie tylko sterty, rzeczy się zmieniły i otrzymujesz mniej OOM (ponieważ heap nie zawiera już bitmap, sprawdź tutaj ), ale nadal powinieneś mieć oko na użycie pamięci, jeśli podejrzewasz, że masz wycieki pamięci. W systemie Android O, jeśli masz wycieki pamięci, które powinny spowodować OOM w starszych wersjach, wygląda na to, że po prostu ulegnie awarii bez możliwości złapania go. Oto jak sprawdzić użycie pamięci:
val nativeHeapSize = Debug.getNativeHeapSize()
val nativeHeapFreeSize = Debug.getNativeHeapFreeSize()
val usedMemInBytes = nativeHeapSize - nativeHeapFreeSize
val usedMemInPercentage = usedMemInBytes * 100 / nativeHeapSize
Ale uważam, że najlepiej byłoby użyć profilera IDE, który pokazuje dane w czasie rzeczywistym za pomocą wykresu.
Dobra wiadomość na Androidzie O jest taka, że znacznie trudniej jest uzyskać awarie z powodu OOM przechowywania zbyt wielu dużych bitmap, ale zła wiadomość jest taka, że nie sądzę, aby można było złapać taki przypadek w czasie wykonywania.
EDYCJA: wydaje się Debug.getNativeHeapSize()
zmieniać w czasie, ponieważ pokazuje całkowitą maksymalną ilość pamięci dla Twojej aplikacji. Dlatego te funkcje są używane tylko przez program profilujący, aby pokazać, ile używa Twoja aplikacja.
Jeśli chcesz uzyskać rzeczywistą całkowitą i dostępną natywną pamięć RAM, użyj tego:
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()
.