2012-03-11 7 views
53

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

enter image description here

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

enter image description here

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

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

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

+1

Какую версию для Android вы используете? Я заметил, что ICS предварительно загружает графические образы, я думаю, чтобы попытаться получить более плавный пользовательский интерфейс и воспользоваться увеличенным пределом памяти VM. Так что если ваш телефон находится на ICS и ваш эмулятор на 2.X, это объясняет разницу. Я лично не тестировал эмулятор, работающий на 4.X, чтобы проверить, присутствует ли надутая память (я думаю, что-то для меня нужно сделать позже). Это определенно есть на моем телефоне, работающем 4.0.3. – sciutand

+0

Мой телефон работает под управлением Android 4.0.3, как и эмулятор. – Glitch

+0

Какую плотность экрана вы используете на эмуляторе или устройстве? – cistearns

ответ

44

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

Там в настоящее время нет способа уменьшить объем памяти, занимаемые данным sPreloadedDrawables

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

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

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

+4

Да. Не будет возможности отключить это - это делается в процессе zygote, который создается один раз и из которого все процессы приложений появляются.Таким образом, загружаемые ресурсы распределяются между всеми процессами. – hackbod

+0

Спасибо cistearns. Моя основная проблема заключается в том, что у меня есть пользователи, которые видят это использование памяти и сообщают об этом. Это влияет на мой звездный рейтинг. Мой телефон использует тот же дисплей, что и iPhone 4, поэтому он имеет очень высокую плотность (примерно 320 dpi). На складе ICS он будет использовать выше 20 МБ, как сообщается Android. Интересно, что после обновления до более поздней сборки это снизилось примерно до 7 МБ. Так что мне интересно, может ли это быть продуктом плохой порт ICS? – Glitch

+1

Похоже, что это была ошибка, которая вызывала больше (или больших) предметов для загрузки во время предварительной загрузки, чем предполагалось. @hackbod Я не полностью врылся в зиготу, чтобы увидеть, что он использовался как spawner (очень круто), поэтому я понимаю, почему всегда требуется предварительная нагрузка. Можно было бы добавить поддержку для очистки ресурсов предварительной загрузки после вилки. Но учитывая, что большой размер, похоже, был ошибкой, и, как правило, он небольшой, я сомневаюсь, что это когда-нибудь понадобится. – cistearns

Смежные вопросы