Стек памяти в Android - PullRequest
       9

Стек памяти в Android

3 голосов
/ 07 мая 2010

Я пишу приложение, в котором есть служба переднего плана, поставщик контента и интерфейс активности, который привязывается к службе и возвращает список объектов с использованием AIDL. Служба работает и обновляет базу данных.

Если я оставляю занятие открытым на 4-8+ часов и захожу в раздел «Запуск служб» в настройках телефона (Nexus One), отображается необычно большой объем используемой памяти (~ 42 МБ).

Я полагаю, что есть утечка. Когда я проверяю кучу памяти, я получаю размер кучи: ~ 18 МБ, ~ 2 МБ выделено, ~ 16 МБ бесплатно. Анализ hprof в Eclipse MAT кажется правильным, что позволяет мне предположить, что память стекает в стек. Это вообще возможно? Если это так, что я могу сделать, чтобы остановить или расследовать утечку? Оправдано ли использование памяти в разделе «Запущенные сервисы» android (я полагаю, это так)?

Еще одно примечание: мне не удалось воспроизвести эту проблему, когда пользовательский интерфейс не работает (работает только служба)

1 Ответ

1 голос
/ 07 мая 2010

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

Если это всего лишь одно приложение, избавьтесь от AIDL и избавьтесь от провайдера контента. Или, по крайней мере, не используйте их самостоятельно - они предназначены для других приложений. Они добавляют накладные расходы, которые вам не нужны для вещей внутри вашей виртуальной машины.

... что наводит меня на мысль, что память стекает в стек. Это вообще возможно?

Не совсем. Стек основного потока приложения тривиально мал. У других потоков есть стеки, которые могут стать намного больше, но я буду удивлен, если вы потратите 42 МБ таким образом.

Если это так, что я могу сделать, чтобы остановить или расследовать утечку?

Поскольку вы уже выполнили «пиковое решение» по тестированию без пользовательского интерфейса и определению, что все в порядке, я бы медленно ввел этот интерфейс и посмотрел, когда вы начнете получать проблему. Одной из вероятных проблемных областей будет обновление действия из фонового потока, так что вы можете отключить его и посмотреть, что произойдет.

Поскольку ваша проблема не в самой куче, я предполагаю, что ваша проблема связана с растровыми изображениями или другими вещами, которые часто используют ОЗУ вне кучи. Камера в вашем аватаре - еще один намек в этом направлении. :-) Убедитесь, что вы recycle() используете свои растровые изображения и тому подобное, и посмотрите, поможет ли это.

...