О потенциальной утечке памяти битовой карты, о которой сообщили инструменты анализа кучи, но нет ни одной битовой карты, используемой приложением
Мое приложение работает нормально (то есть без сбоев). Во время тестирования я исследовал использование памяти. Я использую Android Studio (AI-141.2006197) DDMS для вывода файла Dump HPROF, а затем открываю его в Eclipse Memory Analyzer. Этот инструмент описывает подозрение на утечку:
One instance of "android.graphics.Bitmap" loaded by "<system class loader>" occupies
2,536,984 (40.81%) bytes. The memory is accumulated in one instance of "byte[]"
loaded by "<system class loader>".
Keywords
byte[]
android.graphics.Bitmap
Еще немного информации из dominator_tree:
За последний день я разобрал начальную активность и фрагмент моего приложения на голые кости, убрав все открытия и ссылки на растровые изображения, удалив меню, сервис и все остальное. Осталось только одно занятие, содержащее 1 фрагмент. Фрагмент имеет ListView, каждый элемент списка имеет простой TextView. Растровые изображения не используются. Я могу показать код в последующем редактировании этого вопроса, если это необходимо.
Я тестирую это урезанное приложение на телефоне и планшете. Я устанавливаю приложение, запускаю его, вижу список, отображаемый первым фрагментом, затем завершаю работу. Через DDMS я вызываю GC, затем делаю дамп кучи и проверяю его в анализаторе памяти Eclipse. Как для телефона, так и для планшета я вижу "потенциальную" утечку памяти.
Мой тестовый телефон, использующий ROM cynogenmod, имеет параметр настройки производительности "Разрешить очистку активов" (см. http://pocketnow.com/2012/12/10/5-nexus-4-speed-tips) Когда я включаю эту функцию, моя потенциальная утечка памяти исчезает. Это заставляет меня думать, что с моим приложением в конце концов нет проблем, но это некое системное поведение, которое я не понимаю.
Некоторые вопросы:
- Это вероятно утечка памяти в моем приложении?
- Если в моем тестовом приложении не используются растровые или рисованные изображения, почему выделяется память для растрового изображения? Что я могу проверить?
- Есть ли у вас какие-либо мудрые слова относительно интерпретации того, какие потенциальные утечки памяти, о которых сообщает анализатор памяти Eclipse, можно игнорировать?
Заранее спасибо. Я пришел из встроенного C-фона в реальном времени, поэтому очень нервничаю, когда вижу утечки памяти!
2 ответа
Это растровое изображение связано с системой, а не утечка памяти в приложении. Я пришел к такому выводу в сообщениях, в которых Android EdgeEffect выделяет растровое изображение размером 1 Мегабайт и странное растровое изображение, используя 1 Мб кучи.
Для тех, кто читает это, я хотел бы предложить вашему вниманию еще один очень полезный пост, который показал мне, как просматривать растровые изображения, на которые указывает инструмент Eclipse Memory Analyzer. Это действительно может помочь с отладкой. Смотрите MAT (Eclipse Memory Analyzer) - как просматривать растровые изображения из дампа памяти
Все представления генерируют кэши растровых изображений сами по себе. Это скорее всего утечка памяти. Кажется, это происходит при частых изменениях макета в представлении. Вы можете попробовать отключить кеш, чтобы посмотреть, решит ли он вашу проблему:
view.setDrawingCacheEnabled(false);