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