24

AFAIK en Android, se recomienda hacer referencia a objetos Bitmap como WeakReferences para evitar pérdidas de memoria. Cuando no se guardan más referencias duras de un objeto de mapa de bits, el recolector de basura lo recogerá automáticamente.Mapa de bits, Bitmap.recycle(), WeakReferences y recolección de elementos no utilizados

Ahora, si entiendo correctamente, siempre se debe llamar al método Bitmap.recycle() para liberar un mapa de bits. Creo que esto se debe a que los objetos de mapa de bits tienen una administración de memoria especial.

¿Es correcto?

Si esto es cierto, al usar WeakReferences, debe haber pérdidas de memoria porque Bitmap.recycle() nunca se llama cuando se liberan las WeakReferences. O, de alguna manera, ¿WeakReferences es suficiente para evitar fugas de memoria?

Gracias

Respuesta

50

Bitamp.recycle no se requiere a ser llamados, como el recolector de basura va a limpiar los mapas de bits en su propio tiempo (siempre y cuando no hay referencias). Los mapas de bits en Android se crean en la memoria nativa, no en el montón de VM, por lo que el objeto de mapa de bits real en el montón de VM es muy pequeño, ya que no contiene ningún dato de mapa de bits real. (EDITAR: ya no es el caso a partir de Android 3.0+) El tamaño real del mapa de bits seguirá siendo contado en contra de su uso de pila a efectos de GC y asegurándose de que su aplicación no use demasiada memoria.

Sin embargo, el GC parece ser un poco temperamental cuando se trata de Bitmaps. Si elimina todas las referencias duras, algunas veces (en mi caso) se mantendría en los mapas de bits durante un poco más de tiempo, tal vez debido a la forma extraña en que se asignan/cuentan los objetos de mapa de bits. Bitmap.recycle parece ser bueno para que el GC recolecte ese objeto más rápidamente.

De cualquier manera, no va a memoria de fuga si no llama a Bitmap.recycle siempre que no guarde referencias difíciles accidentalmente. Puede encontrar OutOfMemoryErrors si intenta asignar demasiados mapas de bits a la vez o mapas de bits demasiado grandes sin llamar a .recycle.

EDITAR: Es importante tener en cuenta que a partir de Android 3.0, los mapas de bits ya no se asignan a la memoria nativa. Se asignan en el montón de VM como cualquier otro objeto de Java. Sin embargo, lo que dije sobre no necesitar llamar a reciclar todavía se aplica.

+0

Explicaciones aclaradas. Muchas gracias ! – Sly

+0

Cardo imágenes con intervalos de aproximadamente 20 segundos. Llamo a recycle() pero Debug.getNativeHeapAllocatedSize() muestra que la asignación de memoria nativa está en constante aumento hasta OutOfMemoryError – Maxim

+0

¡esta es una publicación muy buena! – user123321

Cuestiones relacionadas