Определение доступной памяти на 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;
}
код >