Подтвердить что ты не робот

Bitmap, Bitmap.recycle(), WeakReferences и сбор мусора

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

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

Правильно ли это?

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

Спасибо

4b9b3361

Ответ 1

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

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

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

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