Почему 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