Це залежить від вашого визначення того, який запит на пам'ять ви хочете отримати.
Зазвичай ви хочете дізнатися про стан пам’яті купи, оскільки якщо вона використовує занадто багато пам’яті, ви отримаєте 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 робить ваш додаток також використовувати вбудовану оперативну пам’ять (принаймні, для зберігання Bitmaps, що зазвичай є основною причиною величезного використання пам'яті), а не лише купу, все змінилося, і ви отримуєте менше OOM (тому що heap більше не містить растрових зображень, перевірте тут ), але все ж слідкуйте за використанням пам'яті, якщо ви підозрюєте, що у вас є витоки пам'яті. На 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()
.