首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >位图、Bitmap.recycle()、WeakReferences和垃圾收集

位图、Bitmap.recycle()、WeakReferences和垃圾收集
EN

Stack Overflow用户
提问于 2011-02-11 00:03:14
回答 1查看 20K关注 0票数 25

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

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

对吗?

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

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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仍然适用。

票数 50
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4959485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档