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

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

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

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

Изменить: класс кэша Android LRU, на который я ссылаюсь: http://developer.android.com/reference/android/util/LruCache.html

2 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам