Я боролся с этим вчера целый день, и все еще не мог понять это, поэтому я подумал, что пришло время ТАК это.Итак, у меня есть приложение, которое имеет два списка в виде фрагментов в двух действиях, по одному на вкладку.
У меня открыто два эмулятора: 2.3.3 с картой 64 SD, 2.2 с картой 64 SD
и одно устройство: Samsung Galaxy с SD-картой 1 ГБ
Когда я запускаю его на эмуляторе 2.3.3: я иду к первому списку, прокручиваю его вниз.Каждая строка имеет ленивое изображение, загруженное из URL, используя класс DrawableBackgroundDownloader, который можно найти здесь:
Ленивая загрузка изображений в ListView
Затем я перехожу ко второйсписок и начать прокрутку вниз.GC уже добавлен в первый список, но теперь показывает ошибки после появления первых нескольких элементов.
Это вывод, когда он начинает показывать ошибки:
«загрузка изображения» означает, что изображение загружается в потоке, как в упомянутом классе.
У меня есть контроль над изображениями, поэтому я знаю, что каждый список содержит около 40 элементов, и все изображения для обоих списков имеют в общей сложности около 2 МБ
Размер кучи остается более менее неизменным ~ 3,5 МБ, но, как вы можете видеть, внешнийВыделите значение cap cap с 10 МБ ранее на 12 МБ и 14244 КБ, затем на 16291 КБ, затем на 18328 КБ, а затем вдруг не удается выделить.
Что здесь происходит?
Потому что это 2.3.3 Если я использую MAT и анализирую дамп кучи здесь.Он имеет только 2,8 МБ.Я знаю, что растровые изображения не находятся в куче (только ссылки на нее), поэтому мне трудно проанализировать утечку там.В любом случае, похоже, что он связан не с кучей, а с внешней памятью (gc говорит, что в эмуляторе нет OOME)
Гистограмма из кучи при ошибках
Когда я запускаю его на устройстве 2.2 - он работает, и те же действия не приводят к сбою внешнего выделения GC.Однако после успешной прокрутки второго списка до конца сэмпл из GC выглядит так:
03-16 15:30:25.440: D/dalvikvm(19622): GC_EXTERNAL_ALLOC freed 6910 objects / 836600 bytes in 40ms
Почему это выражается здесь как объекты?836600 = ~ 816kb, что это значит?
Когда я запускаю его на эмуляторе 2.2, я также получаю ошибки GC, но немного позже, чем в случае 2.3.3.Добавлю, что замена sd карты на 512 в эмуляторе не имеет значения.
Я все еще новичок в Android, буду признателен за любые подсказки или за указание на ошибки в моих рассуждениях