Я пишу очень ресурсоемкое приложение для Android Honeycomb, и я очень внимательно следил за recycle()
неиспользованными Bitmap
с, где это возможно;действительно, это необходимо для того, чтобы приложение вообще работало, поскольку Bitmap
s постоянно циклически включается и выключается из памяти.Однако я только что реализовал onConfigurationChanged()
в Activity
, и поэтому (по ряду причин) я пытаюсь поместить процедуры освобождения памяти в onStop()
.
В настоящее время мой метод onStop()
:
- устанавливает некоторые
View
с для отображения по умолчанию Drawable
; - вызовов
recycle()
на Bitmap
с, ранее использовавшихся этими View
с; - пустые ссылки на
Bitmap
s.
К сожалению, при использовании профилировщика памяти Eclipse кажется, что не влияет на использование памяти вообще .
Как вы можете себе представить, приложив столько усилий, чтобы высвободить ресурсы на номинально собранном языке, я бы надеялся на еще больший эффект.Итак, мой вопрос: что делает recycle()
?Это фактически вызывает сборку мусора, или система будет удерживать память - даже если вы звоните System.gc()
- до тех пор, пока не почувствуете необходимость от чего-то избавиться?
NB Я знаю Bitmap
s arenфактически не удерживался в обычной куче, но я думал, что вызова recycle()
было достаточно, чтобы убедиться, что они выпали из родной кучи.
ЧАСТЬ ОТВЕТА
Я обнаружил, что если ImageView
содержит Bitmap
, который был переработан, данные Bitmap
все еще сохраняются в памяти до тех пор, пока на ImageView
не будет вызван setImageBitmap(null)
.Это может даже иметь место, если вызываются setImageResource(...)
или setImageDrawable(...)
(они загружались в сравнительно небольшой пакет из девяти патчей - однако анализ MAT показывает, что это не удаляет большой Bitmap
, который содержался в приватномчлены ImageView
).Простой вызов этой функции на onStop()
выкинул около 10 МБ из кучи нашего приложения.По-видимому, это может быть не так для сборок Android до Honeycomb.