У меня есть исключение OutOfMemory с галереей размером более 600x800 пикселей JPEG.
Окружающая среда
Я использовал галерею с изображениями JPG размером около 600x800 пикселей.
Поскольку мой контент может быть немного более сложным, чем просто изображения, я установил для каждого представления RelativeLayout, который обертывает ImageView с помощью JPG.
Чтобы «ускорить» взаимодействие с пользователем, у меня есть простой кеш из 4 слотов, который предварительно выбирает (в цикле) около 1 изображения слева и 1 изображение справа от отображаемого изображения и сохраняет их в HashMap с 4 слотами.
Платформа
Я использую AVD с 256 ОЗУ и 128 размером кучи с экраном 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, и на самом деле нет блока размером 900 КБ, который нужно выделить? Если да, то может ли кто-нибудь сказать мне, где я могу это увидеть?
Большое спасибо
Мейманн