Определение доступной памяти на Android

Таким образом, одна из проблем на Android - это различные спецификации устройства (в частности, память устройства).

Я написал объекты модели, чтобы широко использовать Java SoftReferences в режиме ленивой загрузки, поэтому виртуальная машина может обрезать не используемые в настоящее время части модели данных по своему усмотрению, и они просто восстанавливаются по мере необходимости.

Однако, одна задача на практике с SoftReferences заключается в том, что они, как правило, очищаются в течение нескольких секунд после того, как они слабо ссылаются, а не висят вокруг до тех пор, пока виртуальная машина не станет низкой в ​​памяти, поэтому они хорошо работают с точки зрения разрешения модель для обрезки, но они не работают, так как часто это означает, что в памяти ничего нет. В идеале на устройстве с большим количеством памяти вы позволите пользователю воспользоваться сохранением объектов в памяти.

В результате обычно объединяется SoftReferences с механизмом LRU, где LRU сохраняет жесткий указатель на объекты, на которые ссылаются недавно ссылки. Это, конечно, не идеально, поскольку предполагает, что у вас достаточно памяти для всех этих объектов с ограниченными объектами.

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

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

Кто-нибудь может найти разумный способ обнаружить, что ваша модель данных использует слишком много памяти на определенном устройстве?

Ответ 1

если вы хотите определить доступную память в android, вы можете проверить или перейти в   перспектива → ddms                                                                                                     2) во-вторых, вы можете использовать инструменты анализатора памяти, проверенные в используемой и неиспользуемой памяти, вы также проверяете  доступность памяти.

Ответ 2

Будет ли это работать?

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

Ответ 3

Если вы используете Android NDK:



#include <unistd.h>

size_t getTotalSystemMemory()
{
    long pages = sysconf(_SC_PHYS_PAGES);
    long page_size = sysconf(_SC_PAGE_SIZE);
    return pages * page_size;
}

size_t getFreeSystemMemory()
{
    long pages = sysconf(_SC_AVPHYS_PAGES);
    long page_size = sysconf(_SC_PAGE_SIZE);
    return pages * page_size;
}

код >