2010-07-03 4 views
82

Я использовал/Труды/MemInfo и проанализирован команду response.however это результат показывает, что:Как получить текущее использование памяти в android?

MemTotal: 94348 кБ MemFree: 5784 кБ

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

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

+1

Вы пытаетесь увидеть свободную память на устройство или на приложение? Если для каждого приложения, то его нужно вычислить в куче a-la 'Debug.getNativeHeapFreeSize()'. –

+0

Чтобы вычислить свободную память (в ОЗУ) с помощью/proc/meminfo, вы должны получить совокупность * MemFree *, * Buffers *, * Cached * и * SwapCached *. Существует API для этой цели, предоставляемый Android, который работает на API 16 и в палатах. Meminfo полезен, если вы ориентируетесь на более старые API. –

ответ

138

ВНИМАНИЕ: Это меры ответа использование памяти/доступно УСТРОЙСТВО. Это НЕ, что доступно вашему приложению. Чтобы измерить, что делает ваш APP, и РАЗРЕШЕНО сделать, Use android developer's answer.


Android docs - ActivityManager.MemoryInfo

  1. синтаксического анализа/Proc/MemInfo команда.Вы можете найти код ссылки здесь: Get Memory Usage in Android

  2. использовать ниже код и получить текущую RAM:

    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 * 100.0; 
    

Объяснение числа 0x100000L

1024 bytes  == 1 Kibibyte 
1024 Kibibyte == 1 Mebibyte 

1024 * 1024  == 1048576 
1048576   == 0x100000 

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

P.S: нам нужно вычислить полную память только один раз. так что точка вызова 1 только один раз в вашем коде, а затем после этого вы можете повторно вызвать код точки 2.

+0

Я хочу проверить размер памяти. Что такое MemoryInfo? – Piraba

+0

PIraba, его класс API Android. Проверьте это здесь http://developer.android.com/reference/android/app/ActivityManager.MemoryInfo.html. – Badal

+0

@SanjayJoshi Это потому, что переменная availMem содержит память в байтах. 1024 байтов равна 1 KiloByte и 1024 килобайт равна 1 мегабайт. Таким образом, 1024 * 1024 равно 1048576 –

12

Концепция управления памятью Linux «Свободная память - это потерянная память».

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

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

 
$ free -m 
      total  used  free  shared buffers  cached 
Mem:   5980  1055  4924   0   91  374 
-/+ buffers/cache:  589  5391 
Swap:   6347   0  6347 

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

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

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

+0

free - это не команда оболочки adb ... –

+1

@Igor, тогда вы захотите вместо этого использовать 'cat/proc/meminfo'. Это гораздо более подробно, но «MemFree». «Буферы» и «Кэшированные», вероятно, являются наиболее важными линиями. – sarnold

+0

Это сработало, спасибо! –

16

Другого способ (в настоящее время показывает 25MB бесплатно на моем G1):

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

Эй, Алекс, Большое спасибо за вашу помощь! 1 вопрос еще. Этот код дает мне доступную оперативную память. Я также хочу отобразить Total RAM. Как это получить? – Badal

+0

@Badal Я не знаю Java API для этого. Придерживайтесь разбора/proc/meminfo. – yanchenko

+4

всегда получает 0.0 –

28

Вот способ расчета использования памяти в настоящее время работает приложение:

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; 

} 
+4

Это простой подход, но, как было указано в документации, метод freememory() класса Runtime возвращает доступную память для текущей программы или приложения. Поэтому имейте в виду, что при использовании. – Fatih

+1

это неправильно ... – Peter

+0

@Peter - Да, это «неправильно», потому что он отвечает на другой вопрос, чем задавали.С другой стороны, это «правильно» для того, что обычно требуется разработчику приложения: редко имеет значение общее состояние памяти в DEVICE - если пользователь запускает множество приложений, ОС * должна * использовать большая часть его памяти - в противном случае она неэффективна. OS должна знать, что дает принятый ответ, знать, когда начинать убивать приложения, которые не были использованы в последнее время. Но программа-программист должен знать, что говорит этот ответ (и аналогичный ответ разработчика Android), и runtime.maxMemory. – ToolmakerSteve

1

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

+1

Вы также должны сообщить нам, как его использовать, а не просто «использовать это» ... – not2qubit

4

Я посмотрел на 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 + кэширования данных в/Proc/MemInfo.

Примечание

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

+0

Мне нравится ваш answser – wukong

42

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


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


Кроме того, существует реальное использование оперативной памяти, что, сколько вся система использует - см accepted answer подсчитать, что.

+0

Это очень полезно –

+0

Wow. Так просто, но так верно! – Ran

5

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

ссылка:

Этот метод 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() дорого стоимость так Вы можете переместить свой код члена класса.

0
public static boolean isAppInLowMemory(Context context) { 
    ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
    ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); 
    activityManager.getMemoryInfo(memoryInfo); 

    return memoryInfo.lowMemory; 
} 
Смежные вопросы