2012-03-16 3 views
1

Я боролся с этим вчера весь день, и до сих пор не мог понять это, поэтому я подумал о его времени, чтобы это так. Таким образом, у меня есть приложение, которое имеет два списка в виде фрагментов в двух действиях, по одному на каждую вкладку.android (2.3.3/2.2) - внешнее распределение/выход GC и анализ MAT

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

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

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

Lazy load of images in ListView

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

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

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

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

Heap размер остается более менее же ~ 3.5Mb, но как вы можете видеть внешний переход от крышек с 10 Мбайт до 12 МБ и 14244 Кбит, затем 16291 Кбит, затем 18328 Кбит, а затем внезапно он не может выделить.

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

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

Im все еще новое для Android, я буду признателен за любые подсказки или указывая на ошибки в моих рассуждениях

ответ

0

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

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

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

0

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

Смежные вопросы