Как получить текущее использование памяти в android?

Я использовал / proc / meminfo и проанализировал команду response.however это результат показывает, что:

MemTotal: 94348 kB MemFree: 5784 kB

означает. Он показывает, что есть только 5 МБ свободной памяти. Возможно ли это с мобильным телефоном Android? На моем мобильном телефоне установлено только 5-6 приложений, и никакая другая задача не выполняется. Но все же эта команда показывает, что очень мало свободной памяти.

Может ли кто-нибудь прояснить это? Или есть ли другой способ получить использование памяти в android?

ПРЕДУПРЕЖДЕНИЕ. Этот ответ измеряет использование / доступ к памяти для УСТРОЙСТВА. Это НЕ, что доступно вашему приложению. Чтобы измерить, что делает ваш APP, и разрешено делать, используйте ответ разработчика Android .


Android docs – ActivityManager.MemoryInfo

  1. Parse / proc / meminfo. Вы можете найти здесь код ссылки: Получить использование памяти в Android

  2. Используйте ниже код и получите текущую ОЗУ:

     MemoryInfo mi = new MemoryInfo(); ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); activityManager.getMemoryInfo(mi); double availableMegs = mi.availMem / 0x100000L; //Percentage can be calculated for API 16+ double percentAvail = mi.availMem / (double)mi.totalMem; 

Объяснение номера 0x100000L

 1024 bytes == 1 Kibibyte 1024 Kibibyte == 1 Mebibyte 1024 * 1024 == 1048576 1048576 == 0x100000 

Совершенно очевидно, что число используется для преобразования из байтов в mebibyte

PS: нам нужно вычислить общую память только один раз. Поэтому вызывайте точку 1 только один раз в свой код, а затем после этого вы можете повторно вызвать код точки 2.

Это зависит от вашего определения того, какой запрос памяти вы хотите получить.


Обычно вам нужно знать статус памяти кучи, поскольку, если он использует слишком много памяти, вы получаете 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 использования памяти.


В качестве альтернативы, существует реальное использование ОЗУ, которое зависит от всей системы – см. Принятый ответ, чтобы вычислить это.

Ниже приведен способ расчета использования памяти текущего приложения :

 public static long getUsedMemorySize() { long freeSize = 0L; long totalSize = 0L; long usedSize = -1L; try { Runtime info = Runtime.getRuntime(); freeSize = info.freeMemory(); totalSize = info.totalMemory(); usedSize = totalSize - freeSize; } catch (Exception e) { e.printStackTrace(); } return usedSize; } 

Еще один способ (показывая 25MB бесплатно на моем G1):

 MemoryInfo mi = new MemoryInfo(); ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); activityManager.getMemoryInfo(mi); long availableMegs = mi.availMem / 1048576L; 

Философия управления памятью Linux – «Свободная память – это потерянная память».

Я предполагаю, что следующие две строки покажут, сколько памяти находится в «Буферах» и сколько «кэшировано». Хотя есть разница между ними (пожалуйста, не спрашивайте, какова эта разница :), они оба грубо складываются с объемом памяти, используемой для кэширования данных файла и метаданных.

Гораздо более полезным руководством по бесплатной памяти в системе Linux является free(1) команда; На моем рабочем столе он сообщает такую ​​информацию:

 $ Free -m
              Общее количество использованных свободных буферов в кэше
 Мем: 5980 1055 4924 0 91 374
 - / + буферы / кеш: 589 5391
 Обмен: 6347 0 6347

Линия +/- buffers / cache: line – это магическая линия, она сообщает, что я действительно получил около 589 мегабайт активной требуемой памяти процесса и около 5391 мегабайт свободной памяти в том смысле, что 91 + 374 мегабайта Буферов / кэшированной памяти можно выбросить, если память может быть более выгодно использована в других местах.

(Моя машина работает около трех часов, почти ничего, кроме stackoverflow, поэтому у меня так много свободной памяти.)

Если Android не поставляется со free(1) , вы можете сделать математику самостоятельно с файлом /proc/meminfo ; Мне просто нравится free(1) выходной формат. 🙂

Я отсылаю несколько работ.

Справка:

Этот метод getMemorySize () возвращается MemorySize, который имеет общий и свободный размер памяти.
Я не верю этому кодексу.
Этот код тестируется на LG G3 cat.6 (v5.0.1)

  private MemorySize getMemorySize() { final Pattern PATTERN = Pattern.compile("([a-zA-Z]+):\\s*(\\d+)"); MemorySize result = new MemorySize(); String line; try { RandomAccessFile reader = new RandomAccessFile("/proc/meminfo", "r"); while ((line = reader.readLine()) != null) { Matcher m = PATTERN.matcher(line); if (m.find()) { String name = m.group(1); String size = m.group(2); if (name.equalsIgnoreCase("MemTotal")) { result.total = Long.parseLong(size); } else if (name.equalsIgnoreCase("MemFree") || name.equalsIgnoreCase("Buffers") || name.equalsIgnoreCase("Cached") || name.equalsIgnoreCase("SwapFree")) { result.free += Long.parseLong(size); } } } reader.close(); result.total *= 1024; result.free *= 1024; } catch (IOException e) { e.printStackTrace(); } return result; } private static class MemorySize { public long total = 0; public long free = 0; } 

Я знаю, что Pattern.compile () стоит дорого, поэтому вы можете перенести его код на члена класса.

Я посмотрел на Android Source Tree.

Внутри com.android.server.am. ActivityManagerService.java (внутренняя служба, отображаемая android.app. ActivityManager ).

 public void getMemoryInfo(ActivityManager.MemoryInfo outInfo) { final long homeAppMem = mProcessList.getMemLevel(ProcessList.HOME_APP_ADJ); final long hiddenAppMem = mProcessList.getMemLevel(ProcessList.HIDDEN_APP_MIN_ADJ); outInfo.availMem = Process.getFreeMemory(); outInfo.totalMem = Process.getTotalMemory(); outInfo.threshold = homeAppMem; outInfo.lowMemory = outInfo.availMem < (homeAppMem + ((hiddenAppMem-homeAppMem)/2)); outInfo.hiddenAppThreshold = hiddenAppMem; outInfo.secondaryServerThreshold = mProcessList.getMemLevel( ProcessList.SERVICE_ADJ); outInfo.visibleAppThreshold = mProcessList.getMemLevel( ProcessList.VISIBLE_APP_ADJ); outInfo.foregroundAppThreshold = mProcessList.getMemLevel( ProcessList.FOREGROUND_APP_ADJ); } 

Внутри android.os. Process.java

 /** @hide */ public static final native long getFreeMemory(); /** @hide */ public static final native long getTotalMemory(); 

Он вызывает метод JNI из android_util_Process.cpp

Вывод

MemoryInfo.availMem = MemFree + Cached in / proc / meminfo.

Заметки

Общая память добавляется в уровень API 16.

Вы также можете использовать инструмент DDMS, который является частью SDK android. Он помогает в распределении памяти java-кода и собственного кода c / c ++.