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

时间:2011-02-10 16:03:14

标签: android memory-leaks garbage-collection bitmap weak-references

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

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

这是对的吗?

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

由于

1 个答案:

答案 0 :(得分:50)

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

然而,当涉及到Bitmaps时,GC似乎有点喜怒无常。如果您只是删除所有硬引用,有时(在我的情况下)会挂在Bitmaps上一段时间,可能是因为Bitmap对象被分配/计数的奇怪方式。 Bitmap.recycle似乎有助于让GC更快地收集该对象。

无论哪种方式,只要您没有意外地保留硬引用,如果不调用Bitmap.recycle,则不会泄漏内存。如果您尝试分配过多的位图或过大的位图而不调用OutOfMemoryErrors,则可能会遇到recycle

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