Bitmap, Bitmap.recycle (), WeakReferences y Garbage Collection

AFAIK en Android, se recomienda hacer referencia a objetos Bitmap como WeakReferences para evitar memory leaks. Cuando no se guardan más referencias duras de un objeto de bitmap, el recolector de basura lo recogerá automáticamente.

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

¿Es eso 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 memory leaks?

Gracias

    No es necesario llamar a Bitamp.recycle, ya que el recolector de basura limpiará los mapas de bits por sí solo (siempre que no haya 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 bitmap real en el montón de VM es muy pequeño, ya que no contiene ningún dato de bitmap real. (EDITAR: ya no es el caso a partir de Android 3.0+) El tamaño real del bitmap seguirá siendo contado en contra de su uso de stack para fines de GC y asegurándose de que su aplicación no utiliza 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 bitmap. Bitmap.recycle parece ser bueno para que el GC recolecte ese objeto más rápidamente.

    De cualquier forma, no perderá memoria si no llama a Bitmap.recycle siempre y cuando no guarde las 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.