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


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

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

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

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

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

1 53

1 ответ:

система будет предварительно загружать системные ресурсы по умолчанию, это не зависит от ресурсов вашего приложения, таких как стандартные чертежи для флажков и переключателей. 10.5 MB действительно кажется большим, но есть много системных ресурсов по умолчанию, и изображения больше, когда они хранятся в памяти. Предварительная загрузка не нова, но размер предварительной загрузки может быть больше в ICS. Плотность отображения, вероятно, играет определенную роль в этом наряду с простым добавлением большего количества системных чертежей, предварительно загруженных МИКРОСХЕМА.

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

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

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

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