Подтвердить что ты не робот

Поиск и устранение причины большого размера кучи

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

enter image description here

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

enter image description here

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

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

EDIT: Я заметил, что размер кучи существенно ниже при запуске в эмуляторе. Это довольно запутанно.:/

4b9b3361

Ответ 1

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

В настоящее время нет способа уменьшить память, хранящуюся в sPreloadedDrawables

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

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

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