Я столкнулся с некоторым раздражающим OutOfMemoryErrors
, даже после того, как убедиться, что все мои растровые изображения правильно масштабированы и т.д. На самом деле проблема, похоже, не связана с растровыми изображениями, но я могу ошибаться.
Для тестирования и устранения ошибок Ive переключался между двумя действиями (позволяет называть их Main и List) с помощью моего навигационного ящика (не используя кнопку "Назад" ). В DDMS я могу видеть, что выделенная память увеличивается каждый раз до 180 КБ.
Ive сделал дампы памяти и использовал Eclipse MAT для анализа 3 разных момента времени:
Я подозреваю, что происходит утечка памяти, но я не могу найти причину. Согласно дампам памяти, это похоже на то, что "Остальные" и java.lang.FinalizerReference
продолжают расти. Пользователь в этом вопросе также имеет много FinalizerReferences
в своем дампе памяти, но ответ не совсем ясен.
Отчет о подозрениях на утечку, который я сделал в последний момент времени, не очень полезен, поскольку он подозревает android.content.res.Resources
и android.graphics.Bitmap
, которые, похоже, со временем не растут:
В одном из отчетов (к сожалению, здесь нет) я видел, как 13 экземпляров android.widget.ListView
указывали на потенциальную вероятность утечки.
Эти увеличения памяти происходят с любым переходом между действиями (а не только основным и списком, которые я использовал в этом примере).
Как я могу найти (неочевидную?) утечку памяти? Я долго царапал себе голову, поэтому любая помощь и советы были бы замечательными.
EDIT:
-
Растровые изображения (@OrhanC1): Я прокомментировал любые
Bitmap
экземпляры в двух действиях, упомянутых выше, и память все еще увеличивается. Дамп памяти по-прежнему показывает некоторые растровые изображения, но я считаю, что они связаны с ресурсами, а не с фактическими растровыми изображениями, выделенными мной. -
Что касается пользовательских шрифтов (@erakitin): я использую их, но я сохраняю один экземпляр каждого
Typeface
в моемApplication
контексте (public class MyApp extends Application
) с использованием одноэлементного. Я пробовал комментировать любые ссылки на шрифты в двух упомянутых выше действиях, и память все еще увеличивается. -
Я не думаю, что я утечка
Context
(@DigCamara): у меня нет никаких статических ссылок внутри этих двух действий, я использую контекстApplication
вместоActivity
кроме адаптера. Если я остаюсь в том жеActivity
и выполняю некоторые вращения экрана, память не увеличивается. -
На основе комментария @NickT: я вижу, что у меня есть много примеров обоих действий. Могла ли эта память увеличиваться только в результате увеличения количества действий заднего стека, а не утечки памяти (я, хотя ОС справился с этим, по-видимому, не)? Если я использую флаг намерения
FLAG_ACTIVITY_REORDER_TO_FRONT
, тогда память увеличивается только до тех пор, пока все различные действия не будут созданы (один раз). Полезно для этого: Android не убивает действия из стека, когда память низкая.