Почему 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 указывал, что первичными объектами, потребляющими всю память, были Bitmaps, BitmapDrawables и NinePatchDrawables. Я не понимаю, откуда берутся эти ассигнования.


person Community    schedule 10.02.2012    source источник
comment
Хм, может быть, вы могли бы попробовать создать новое приложение с минимальными затратами, посмотреть, сколько его там используется.   -  person FabianCook    schedule 10.02.2012
comment
Я попробовал это сделать, в некоторых случаях с включенным аппаратным ускорением и подключенной библиотекой совместимости это может быть менее 10% свободной кучи на GN.   -  person Ljdawson    schedule 21.02.2012


Ответы (1)


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

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

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

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

Растровые изображения в Android

person antonyt    schedule 12.02.2012