Выявление и устранение причины большого размера кучи - PullRequest
53 голосов
/ 11 марта 2012

Я пытаюсь понять, почему мое приложение использует так много памяти. Я часто вижу это с использованием между 15 и 18 МБ, что значительно выше, чем я ожидал. Я посмотрел на размер кучи через DDMS и увидел это:

enter image description here

Это выглядело немного подозрительно, потому что мое приложение вообще не имеет дело с большими изображениями. На самом деле общая сумма доступных для рисования в моем приложении составляет около 250 КБ. Поэтому я создал дамп кучи и использовал MAT, чтобы определить местонахождение всей этой памяти. Массивы byte [] были, безусловно, самым большим потребителем, поэтому я проанализировал и заметил следующее:

enter image description here

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

Куда мне идти отсюда? Мое приложение работает в основном в фоновом режиме через сервисы, которые вообще не работают с данными изображений. У меня есть действия, которые пользователь может выбрать для использования, но опять же, они используют небольшие объекты, которые не объясняют такой большой размер кучи. Я также проверил любые неприятные случаи утечки активности и т. Д., Но не обнаружил их.

РЕДАКТИРОВАТЬ: я заметил, что размер кучи существенно меньше при запуске в эмуляторе. Это довольно запутанно. : /

1 Ответ

44 голосов
/ 04 апреля 2012

Система будет предварительно загружать системные ресурсы по умолчанию, это не зависит от ресурсов вашего приложения, таких как стандартные Drawables для флажков и переключателей.10,5 МБ кажется большим, но системных ресурсов по умолчанию много, а изображения больше, когда они сохраняются в памяти.Предварительная загрузка не нова, но размер предварительной загрузки может быть больше в ICS.Плотность отображения, вероятно, играет роль в этом наряду с простым добавлением дополнительных системных Drawables, предварительно загруженных в ICS.

В настоящее время нет способа уменьшить объем памяти, удерживаемой sPreloadedDrawables

.К сожалению, нет способа очистить это после того, как процесс приложения порожден для приложений (особенно игр), которые не используют большинство системных Drawables.В этом случае, хотя большой размер ресурсов предварительной загрузки, по-видимому, был ошибкой для определенного выпуска (или порта телефонной трубки) ICS.В противном случае это обычно небольшой объем памяти, поэтому я сомневаюсь, что когда-либо понадобится такой механизм, чтобы уменьшить использование памяти предварительной загрузки.

Если у вас заканчивается память из-за этого кеша,Я, вероятно, подам отчет об ошибке в Google.

Вы можете проследить здесь процесс предварительной загрузки ресурса, если вас интересуют дополнительные внутренние детали. ZygoteInit.preloadResources

...