Определение размера LRU Cache в зависимости от возможностей устройства и свободной памяти - PullRequest
12 голосов
/ 22 февраля 2012

Я думаю о реализации первого слоя моего кэширования в приложении для 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 ]

14 голосов
/ 03 мая 2012

Я думаю, что правильное решение для расчета размера 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

0 голосов
/ 22 февраля 2012

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

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

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

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

...