Android (2.3.3 / 2.2) - внешнее распределение / выход GC и анализ MAT - PullRequest
1 голос
/ 16 марта 2012

Я боролся с этим вчера целый день, и все еще не мог понять это, поэтому я подумал, что пришло время ТАК это.Итак, у меня есть приложение, которое имеет два списка в виде фрагментов в двух действиях, по одному на вкладку.

У меня открыто два эмулятора: 2.3.3 с картой 64 SD, 2.2 с картой 64 SD

и одно устройство: Samsung Galaxy с SD-картой 1 ГБ

Когда я запускаю его на эмуляторе 2.3.3: я иду к первому списку, прокручиваю его вниз.Каждая строка имеет ленивое изображение, загруженное из URL, используя класс DrawableBackgroundDownloader, который можно найти здесь:

Ленивая загрузка изображений в ListView

Затем я перехожу ко второйсписок и начать прокрутку вниз.GC уже добавлен в первый список, но теперь показывает ошибки после появления первых нескольких элементов.

Это вывод, когда он начинает показывать ошибки: enter image description here

«загрузка изображения» означает, что изображение загружается в потоке, как в упомянутом классе.

У меня есть контроль над изображениями, поэтому я знаю, что каждый список содержит около 40 элементов, и все изображения для обоих списков имеют в общей сложности около 2 МБ

Размер кучи остается более менее неизменным ~ 3,5 МБ, но, как вы можете видеть, внешнийВыделите значение cap cap с 10 МБ ранее на 12 МБ и 14244 КБ, затем на 16291 КБ, затем на 18328 КБ, а затем вдруг не удается выделить.

Что здесь происходит?

Потому что это 2.3.3 Если я использую MAT и анализирую дамп кучи здесь.Он имеет только 2,8 МБ.Я знаю, что растровые изображения не находятся в куче (только ссылки на нее), поэтому мне трудно проанализировать утечку там.В любом случае, похоже, что он связан не с кучей, а с внешней памятью (gc говорит, что в эмуляторе нет OOME)

Гистограмма из кучи при ошибках

enter image description here

Когда я запускаю его на устройстве 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, буду признателен за любые подсказки или за указание на ошибки в моих рассуждениях

Ответы [ 3 ]

0 голосов
/ 16 марта 2012

Это было то, что мне рекомендовали некоторое время назад. Никогда не использовал его, но многим это понравилось. ListViewImageManager

0 голосов
/ 26 марта 2012

Спасибо, ребята, за ваши предложения;Я закончил тем, что использовал этот замечательный кусок кода для обработки изображений, очень рекомендованный https://github.com/nostra13/Android-Universal-Image-Loader

0 голосов
/ 16 марта 2012

У вас есть утечка памяти, и вы должны утилизировать каждое изображение, которое вы не используете. Возможно также уменьшите их до размеров каждого изображения. Я слишком долго боролся с этой проблемой. Как эффективно управлять X количеством изображений. Отслеживайте все имеющиеся у вас растровые изображения и узнайте, когда они назначены для imageView, а затем утилизируйте все остальные.

Если вы знаете, сколько изображений и их размеры тогда вы можете рассчитать, чем сможете обработать, например, 50 изображений в любой данный момент.

Положите руки на телефон ICS или планшет Honeycomp. Распределение памяти растрового изображения externatl видно в мате, и вы можете выяснить, где у вас утечка.

...