2012-01-25 2 views
13

Я видел во многих образцах, что разработчики называют recycle() на bitmap, а затем устанавливают его на null. Почему это необходимо, разве сборщик мусора не заботится о выпуске растрового изображения?Android - битмап и управление памятью?

Bitmap bitmap = BitmapFactory.decodeStream(inputStream); 
bitmap.recycle(); 
bitmap = null; 

ответ

17

Вступить в клуб. Это не совсем так.

Дело в том, что в версиях Android до сотовой памяти память для растровых изображений была выделена из неуправляемой памяти, что создает всевозможные проблемы. Он все еще выпущен, но из финализатора реализации объекта bitmap. Это означает, что для его сбора потребуется не менее 2 проходов GC. Также, если по какой-либо причине финализатор не выполнит - вы получили снимок. Другое дело - это не очень трудно проследить - DDMS не видит и ни один не делает MAT

Для Android 3.0 это было изменено и растровые изображения реализуются через управляемые массивы байтов, но для старых телефонов ...

3

bitmap.recycle(); освободить кучу родной, которая используется в битмапах. И установка его в null - это помочь GC быстро собрать вашу ссылку.

+3

@aryaxt: Обратите внимание, что в то время как финализатор выполнит 'recycle()' для вас, вызов его сам освободит память раньше, что значительно снизит вероятность того, что вы выйдете из кучи. – CommonsWare

+1

да .... еще одна вещь, которую нужно отметить .... вам нужно быть уверенным, что растровое изображение больше не используется до того, как вы переработаете ... иначе вы столкнулись бы с исключениями при попытке использовать переработанное растровое изображение. –

+4

Также, как и в случае с растровыми изображениями Android 3.0, больше не использовать родную кучу. –

1

От документов до http://developer.android.com/reference/android/graphics/Bitmap.html#recycle%28%29.


Освободите родной объект, связанный с этим растровым изображением, и очистите ссылку на данные пикселя. Это не освобождает данные пикселя синхронно; он просто позволяет собирать мусор, если нет других ссылок. Растровое изображение отмечено как «мертвое», что означает, что оно выдает исключение, если вызывается getPixels() или setPixels(), и ничего не рисует. Эта операция не может быть отменена, поэтому ее следует вызывать, только если вы уверены, что для растрового изображения больше не используются. Это расширенный вызов и, как правило, не нужно вызывать, так как обычный процесс GC освободит эту память, если больше нет ссылок на это растровое изображение.


Таким образом, для вызова не требуется. Единственный раз, когда я когда-либо слышал о необходимости вручную установить объект в null, является его статическая переменная (или какая-то переменная, которая не выйдет за пределы области легко), и вы хотите вывести ее из памяти. Возможно, если вы постоянно выделяете растровые изображения быстро, может возникнуть необходимость попытаться принудительно собрать мусор, но в большинстве случаев это, вероятно, не нужно.

+1

Все выглядит хорошо, как в документации, но было так много случаев, когда растровое изображение вызвало OOM .... поэтому, если вы сталкиваетесь с этой проблемой в своем коде, общий способ исправить это - убедиться, что мы установили bitmap в null и вызывать gc из кода ... (да, я знаю, что это не оптимально, и это не гарантируется gc) ... но это было последнее средство, чтобы вернуть некоторую память ... Вы также можете попробовать используя SoftReferences для кэширования растровых изображений –

+0

Я загрузил сразу сотни растровых изображений в память и не имел проблем.Единственный способ, которым я могу это видеть, - это проблема на современных телефонах, если у вас утечка памяти в растровых изображениях или вы быстро выделяете и отбрасываете растровые изображения (гораздо больше, чем вы можете поместить на свой экран сразу). – onit

+0

http://code.google.com/p/android/issues/detail?id=11089 Проверьте ответ реплики парней .... –

0

This article from android development docs имеет много информации по этой теме. Пока вы на нем также проверяете статью о кешировании, если вы будете использовать несколько растровых изображений.

Смежные вопросы