在Android上,建议引用Bitmap对象为WeakReferences,以避免内存泄漏。当不再保留位图对象的硬引用时,垃圾回收器将自动收集它。
现在,如果我理解正确的话,必须始终调用Bitmap.recycle()方法来释放位图。我认为这是因为Bitmap对象有特殊的内存管理。
对吗?
如果这是真的,那么在使用WeakReferences时,一定会有内存泄漏,因为在释放WeakReferences时从不调用Bitmap.recycle()。或者,不知何故,WeakReferences足以避免内存泄漏吗?
谢谢
发布于 2011-02-11 00:33:58
Bitmap.recycle不是需要调用的,因为垃圾收集器最终会自己清理位图(只要没有引用)。Android中的位图是在本机内存中创建的,而不是在VM堆中创建的,因此VM堆上的实际位图对象非常小,因为它不包含任何实际的位图数据。(编辑:不再像Android 3.0+那样)位图的实际大小仍将计入您的堆使用量中,以便进行GC并确保您的应用程序不会使用太多内存。
然而,当涉及到位图时,GC似乎有点喜怒无常。如果只是删除所有硬引用,它有时(在我的例子中)会在Bitmap上停留一段时间,可能是因为分配/计数Bitmap对象的奇怪方式。Bitmap.recycle似乎有利于让GC更快地收集该对象。
无论哪种方式,只要不意外地保留硬引用,只要不调用,就不会泄漏内存。但是,如果您尝试一次分配太多的位图,或者在没有调用recycle的情况下分配太大的位图,您可能会遇到OutOfMemoryErrors。
编辑:值得注意的是,从Android3.0开始,位图不再分配在本机内存中。与任何其他Java对象一样,它们在VM堆上进行分配。但是,我所说的不需要调用recycle仍然适用。
https://stackoverflow.com/questions/4959485
复制相似问题