Почему Android 4.0/Ice Cream Sandwich выделяет так много памяти кучи?

Я заметил, что на моем Galaxy Nexus android.content.res.Resources выделяется около 11 МБ. Я обнаружил это, когда я работал в процессе профилирования с использованием DDMS и опции "Dump HPROF file". Итак, я потратил два часа, пытаясь выяснить, связано ли распределение с чем-то в моем коде или поддерживающих библиотеках. Я удалил все свои данные, тонну классов, все мои библиотеки и не видел никаких изменений. После размещения точки останова в моем коде в начале метода onCreate() активности, он показал, что выделение 11 МБ уже присутствует.

После того, как я был полностью смущен, я решил подключить свой внедренный Nook Color, работающий на CM7, чтобы узнать, что он сообщал для использования начальной памяти для того же самого приложения. Наихудшая память "Проблемный Подозреваемый", о которой сообщает MAT, весит всего лишь 896 КБ.

Является ли ICS самым тяжелым? Я что-то упустил? Насколько я могу судить, мое приложение функционирует правильно, но, если использование кучи указывает на 97%, меня беспокоят возможные сбои.

Если это помогает, MAT указывает, что основными объектами, потребляющими всю память, были битмапы, BitmapDrawables и NinePatchDrawables. Я не понимаю, откуда эти распределения.

Ответы

Ответ 1

Pre-Honeycomb (< 3,0), битмапы были распределены в нативной куче и не отображались в далках Далвика, как показано Eclipse MAT и т.д. Это собственное распределение по-прежнему способствовало максимальным пределам кучи Dalvik для приложения, и все еще чтобы сбор мусора выполнялся примерно в правильное время при приближении к ситуации с низкой памятью. Это использование можно измерить с помощью Debug.getNativeHeapAllocatedSize().

Начиная с Android 3.0 (включая ICS), теперь он выделяет пиксельные данные для битмапов в обычных байтовых массивах в куче Dalvik. Практические последствия этого - лучшее/упрощенное поведение сбора мусора для битмапов (поскольку их можно трактовать более ортодоксальным образом) и возможность отслеживать распределения битмапов в даллах Далвика.

Я не думаю, что фактическое использование памяти для конкретного приложения существенно отличается между пре-Honeycomb и более поздними версиями, и что это всего лишь вопрос альтернативной практики бухгалтерского учета.

Анализ памяти для Android

BitMaps на Android