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

Калибровка LRU Cache в соответствии с возможностями устройства и свободной памятью

Я думаю о внедрении первого уровня кэширования в приложении для Android. Я рассматривал SoftReferences, чтобы избежать исключений OOM, но поскольку есть много статей о том, как Android освобождает их "слишком рано", я решил посмотреть в кеш android.util.LruCache.

Вопрос: Как правильно настроить его на самом устройстве? Все звучит очень хорошо, что кеш LRU - это реальное решение, а не SoftReferences, но если вы действительно хотите избежать исключений OOM, он чувствует себя крайне небезопасным, чтобы идти с любым количеством мегабайт жестких ссылок. Это просто небезопасно, если вы спросите меня. Во всяком случае, это единственный вариант. Я изучал getMemoryClass, чтобы узнать размер кучи приложения на самом устройстве (+ проверка свободного размера кучи, прежде чем размер кеша увеличился). Базовая линия - 16 мегабайт, которая звучит нормально, но я видел устройства (например, в прошлом в G1), бросая исключения OOM размером около 5 мегабайт от размера кучи (согласно Eclipse MAT). Я знаю, что G1 очень старый, но дело в том, что мои впечатления не совпадают с базовым уровнем 16 Megs, о котором упоминается в документации. Поэтому я совершенно не знаю, как мне увеличить кеш LRU, если мне нужно, насколько я могу разумно получить. (будет доволен 8 мегабайтами и будет занимать всего 1 мегабит на устройстве с низким уровнем)

Спасибо за любые подсказки.

Изменить: класс кеша Android LRU Я имею в виду: http://developer.android.com/reference/android/util/LruCache.html

4b9b3361

Ответ 1

Я думаю, что правильное решение для вычисления размера LruCache указано в руководстве dev:

int memClass = ( ( ActivityManager )context.getSystemService( Context.ACTIVITY_SERVICE ) ).getMemoryClass();
int cacheSize = 1024 * 1024 * memClass / 8;

Более подробную информацию можно найти здесь: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

Ответ 2

Из вашего вопроса это немного запутывает, чтобы понять, что вы просите. Позвольте мне сделать это.

Различные продукты кеширования AppFabric, memcached, ncache и scaleout имеют ограничение 1M для каждого объекта. Я думаю, что масштабирование действительно предлагает некоторую настройку.

Но все это продукты на стороне сервера. Таким образом, для устройства Android, которое, скорее всего, будет единственным локальным кешем одного хоста, я, вероятно, перейду с максимальным размером 64 КБ. Я имею в виду, зачем кому-то понадобилось больше 64 КБ на объект на устройстве. Просто думаю.

Если бы я был вами, я бы изучил memcached (самое известное решение для кеширования с открытым исходным кодом). И может быть масштабирование, так как его легко получить мир привет, работающий с масштабированием тоже. И пропорционально решить.