Bitmap,Bitmap.recycle(),WeakReferences和垃圾收集

Android上的AFAIK,build议引用Bitmap对象作为WeakReferences,以避免内存泄漏。 当没有更多的硬引用保留位图对象时,垃圾收集器将自动收集它。

现在,如果我理解正确,必须始终调用方法Bitmap.recycle()来释放一个位图。 我认为这是因为Bitmap对象有特殊的内存pipe理。

那是对的吗?

如果这是真的,那么在使用WeakReferences时,必须存在内存泄漏,因为在释放WeakReferences时,Bitmap.recycle()永远不会被调用。 或者,不知何故,WeakReferences足以避免内存泄漏?

谢谢

Bitamp.recycle 不需要被调用,因为垃圾收集器最终会自行清理位图(只要没有引用)。 Android中的位图是在本机内存中创build的,而不是在VM堆中创build的,因此VM堆中实际的Bitmap对象非常小,因为它不包含任何实际的位图数据。 (编辑:不再是Android 3.0以上的情况下)位图的实际大小仍然会计算在您的堆使用GC的目的,并确保您的应用程序不使用太多的内存。

但是,当谈到Bitmaps时,GC似乎有点喜怒无常。 如果你只是删除所有的硬引用,它有时(在我的情况下)挂在Bitmaps一会儿,可能是因为奇怪的方式位图对象分配/计数。 Bitmap.recycle似乎很适合让GC更快地收集对象。

无论哪种方式,只要您不意外地保留严重的引用,您不会泄漏内存,如果您不调用Bitmap.recycle。 你可能会遇到OutOfMemoryErrors,如果你尝试一次分配太多的位图,或者太大的位图,但是没有调用.recycle。

编辑:重要的是要注意,从Android 3.0,位图不再分配在本机内存。 像任何其他Java对象一样在VM堆上分配。 但是,我所说的不需要召回回收仍然适用。