Bitmap, Bitmap.recycle (), WeakReferences и сборка мусора - PullRequest
24 голосов
/ 10 февраля 2011

AFAIK на Android, рекомендуется ссылаться на объекты Bitmap как WeakReferences, чтобы избежать утечек памяти.Когда больше нет жестких ссылок на растровый объект, сборщик мусора автоматически соберет его.

Теперь, если я правильно понимаю, метод Bitmap.recycle () всегда должен вызываться для освобождения растрового изображения.Я думаю, это потому, что объекты Bitmap имеют специальное управление памятью.

Это правильно?

Если это так, то при использовании WeakReferences должны быть утечки памяти, потому что Bitmap.recycle () никогда не бываетвызывается, когда WeakReferences освобождаются.Или, так или иначе, WeakReferences достаточно, чтобы избежать утечек памяти?

Спасибо

1 Ответ

50 голосов
/ 10 февраля 2011

Bitmap.recycle не требуется для вызова, так как сборщик мусора в конечном итоге самостоятельно очистит растровые изображения (если нет ссылок).Растровые изображения в Android создаются в собственной памяти, а не в куче виртуальных машин, поэтому фактический объект растрового изображения в куче виртуальных машин очень мал, поскольку он не содержит реальных растровых данных. (РЕДАКТИРОВАТЬ: больше не относится к Android 3.0 +) Реальный размер растрового изображения все равно будет учитываться при использовании кучи для целей GC, и убедитесь, что ваше приложение не использует слишком много памяти.

Однако GC кажется немного капризным, когда дело доходит до битмапов.Если вы просто удалите все жесткие ссылки, иногда (в моем случае) они будут зависать на растровых изображениях на некоторое время дольше, возможно, из-за странного способа размещения / подсчета растровых объектов.Bitmap.recycle, по-видимому, хорош для того, чтобы заставить GC быстрее собирать этот объект.

В любом случае, вы не будете пропускать память, если не будете долго вызывать Bitmap.recycleкак вы не держите жесткие ссылки случайно.Вы можете столкнуться с OutOfMemoryErrors, если попытаетесь выделить слишком много растровых изображений одновременно или слишком большие растровые изображения без вызова recycle.

РЕДАКТИРОВАТЬ: Важно отметить, что с Android 3.0 растровые изображения небольше выделяется в родной памяти.Они размещаются в куче виртуальной машины, как и любой другой объект Java.Однако то, что я сказал о том, что нет необходимости вызывать функцию recycle, по-прежнему применимо.

...