Подтвердить что ты не робот

Android: как проверить, сколько памяти осталось?

Ниже приведена моя формула, чтобы проверить, сколько осталось памяти (не сколько памяти осталось в текущей куче, но сколько еще памяти может быть использовано до сбоя приложения). Я не отдаленно уверен, что это правильно, не так ли?

double max = Runtime.getRuntime().maxMemory(); //the maximum memory the app can use
double heapSize = Runtime.getRuntime().totalMemory(); //current heap size
double heapRemaining = Runtime.getRuntime().freeMemory(); //amount available in heap
double nativeUsage = Debug.getNativeHeapAllocatedSize(); //is this right? I only want to account for native memory that my app is being "charged" for.  Is this the proper way to account for that?

//heapSize - heapRemaining = heapUsed + nativeUsage = totalUsage
double remaining = max - (heapSize - heapRemaininng + nativeUsage); 
4b9b3361

Ответ 1

Попробуйте использовать следующий код. это должно дать вам результаты, которые вам нужны (особенно поле Pss). Вы можете прочитать об этом здесь

Debug.MemoryInfo memoryInfo = new Debug.MemoryInfo();
Debug.getMemoryInfo(memoryInfo);

String memMessage = String.format(
    "Memory: Pss=%.2f MB, Private=%.2f MB, Shared=%.2f MB",
    memoryInfo.getTotalPss() / 1024.0,
    memoryInfo.getTotalPrivateDirty() / 1024.0,
    memoryInfo.getTotalSharedDirty() / 1024.0);

Ответ 2

Это старый поток, но это работает:

  Runtime.getRuntime().gc();
  long memoryAvailable = (Runtime.getRuntime().maxMemory() -
        Runtime.getRuntime().totalMemory() +
        Runtime.getRuntime().freeMemory());

totalMemory-freeMemory - текущая используемая память.

Итак, это сводится к:

(maximum possible memory)-(current used memory)

Изменить для добавления: freeMemory не подсчитывает доступную память для сбора мусора, поэтому вы можете попробовать Runtime.getRuntime(). gc(), хотя понимаете, что могут иметь свои собственные последствия (например, визуальные икоты, если они запускаются в потоке пользовательского интерфейса).