Это зависит от вашего определения того, какой запрос памяти вы хотите получить.
Обычно вам нужно знать состояние кучи памяти, поскольку, если она использует слишком много памяти, вы получаете OOM и вылетаете из приложения.
Для этого вы можете проверить следующие значения:
final Runtime runtime = Runtime.getRuntime();
final long usedMemInMB=(runtime.totalMemory() - runtime.freeMemory()) / 1048576L;
final long maxHeapSizeInMB=runtime.maxMemory() / 1048576L;
final long availHeapSizeInMB = maxHeapSizeInMB - usedMemInMB;
Чем больше переменная usedMemInMB приближается к maxHeapSizeInMB, тем ближе availHeapSizeInMB
к нулю, тем ближе вы получаете OOM. (Из-за фрагментации памяти вы можете получить OOM ДО того, как он достигнет нуля.)
Это также показывает инструмент использования памяти DDMS.
В качестве альтернативы, существует реальное использование ОЗУ, то есть то, сколько использует вся система - см. Принятый ответ, чтобы рассчитать это.
Обновление: поскольку Android O заставляет ваше приложение также использовать собственную оперативную память (по крайней мере, для хранения растровых изображений, что обычно является основной причиной огромного использования памяти), а не только кучу, все изменилось, и вы получаете меньше OOM (потому что куча больше не содержит растровых изображений, проверьте здесь ), но вы все равно должны следить за использованием памяти, если подозреваете, что у вас есть утечки памяти. В Android O, если у вас есть утечки памяти, которые должны были вызвать OOM в более старых версиях, кажется, что он просто выйдет из строя, и вы не сможете его поймать. Вот как проверить использование памяти:
val nativeHeapSize = Debug.getNativeHeapSize()
val nativeHeapFreeSize = Debug.getNativeHeapFreeSize()
val usedMemInBytes = nativeHeapSize - nativeHeapFreeSize
val usedMemInPercentage = usedMemInBytes * 100 / nativeHeapSize
Но я считаю, что лучше всего использовать профилировщик IDE, который отображает данные в реальном времени с помощью графика.
Итак, хорошая новость для Android O заключается в том, что намного сложнее получить сбои из-за OOM хранения слишком большого количества больших растровых изображений, но плохая новость заключается в том, что я не думаю, что возможно выявить такой случай во время выполнения.
РЕДАКТИРОВАТЬ: кажется Debug.getNativeHeapSize()
со временем меняется, так как он показывает общий максимальный объем памяти для вашего приложения. Таким образом, эти функции используются только для профилировщика, чтобы показать, сколько использует ваше приложение.
Если вы хотите получить реальную общую и доступную собственную оперативную память, используйте это:
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()
.