У меня есть исключение OutOfMemory с галереей размером более 600x800 пикселей.
Среда
Я использую Gallery с изображениями JPG размером около 600x800 пикселей.
Поскольку мой контент может быть немного сложнее, чем просто изображения, я установил каждое представление как RelativeLayout, которое обертывает ImageView с помощью JPG.
Чтобы "ускорить" пользовательский опыт, у меня есть простой кэш из 4 слотов, которые предварительно заполняют (в петлере) примерно 1 изображение слева и 1 изображение прямо на отображаемое изображение и сохраняют их в 4-х слот-хэш-карте.
Платформа
Я использую AVD 256 RAM и 128 Heap Size, с экраном 600x800. Это также происходит на целевом объекте Entourage Edge, за исключением того, что с устройством сложнее отлаживать.
Проблема
Я получаю исключение:
OutofMemoryError: bitmap size exceeds VM budget
И это происходит при извлечении пятого изображения. Я попытался изменить размер кеша изображения, и он все тот же.
Странная вещь: проблема с памятью не должна быть
Чтобы убедиться, что предел кучи очень далек от того, что мне нужно, я определил макет 8МБ в начале и оставил его без привязки, чтобы он сразу отправился. Он является членом потока активности и определяется как
static { @SuppressWarnings("unused")
byte dummy[] = new byte[ 8*1024*1024 ]; }
В результате размер кучи составляет около 11 МБ, и все это бесплатно. Заметьте, я добавил этот трюк после того, как он начал крушить. Это делает OutOfMemory менее частым.
Теперь я использую DDMS. Перед сбоем (не сильно изменится после сбоя), DDMS показывает:
ID Heap Size Allocated Free %Used #Objects
1 11.195 MB 2.428 MB 8.767 MB 21.69% 47,156
В таблице подробностей показано:
Type Count Total Size Smallest Largest Median Average
free 1,536 8.739MB 16B 7.750MB 24B 5.825KB
Самый большой блок - 7,7 МБ. И все же LogCat говорит:
ERROR/dalvikvm-heap(1923): 925200-byte external allocation too large for this process.
Если вы не согласны с отношением медианного и среднего, то можно предположить, что большинство доступных блоков очень малы. Однако есть блок, достаточно большой для растрового изображения, он 7.7M. Почему этого еще недостаточно?
Примечание. Я записал график кучи. Рассматривая объем выделенных данных, он не чувствует себя больше, чем выделено 2М. Он соответствует отчету свободной памяти от DDMS.
- Может ли быть, что у меня возникла какая-то проблема, например куча-фрагментация?
- Как решить/решить проблему?
- Является ли куча общей для всех потоков?
- Может быть, я интерпретирую DDMS-считывание неправильно, и на самом деле нет блока 900K для выделения? Если да, то кто-нибудь может сказать мне, где я могу это видеть?
Спасибо большое
Meymann