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