据我所知,在 Android 上,建议将 Bitmap 对象作为 WeakReferences 引用,以避免内存泄漏。当位图对象不再保留硬引用时,垃圾收集器将自动收集它。
现在,如果我理解正确的话,必须始终调用 Bitmap.recycle() 方法来释放位图。我认为这是因为 Bitmap 对象有特殊的内存管理。
那是对的吗?
如果这是真的,那么当使用WeakReferences时,一定会出现内存泄漏,因为当WeakReferences被释放时,Bitmap.recycle()永远不会被调用。或者,以某种方式,WeakReferences 是否足以避免内存泄漏?
Thanks
Bitmap.recycle
isn't required被调用,因为垃圾收集器最终会自行清理位图(只要没有引用)。 Android 中的位图是在本机内存中创建的,而不是在 VM 堆上创建的,因此 VM 堆上的实际位图对象非常小,因为它不包含任何实际的位图数据。(编辑:从 Android 3.0+ 开始不再是这种情况)位图的实际大小仍将计入您的堆使用量,以便进行 GC 并确保您的应用程序不会使用太多内存。
然而,当谈到位图时,GC 似乎有点喜怒无常。如果您只是删除所有硬引用,有时(在我的情况下)它会在位图上挂起一段时间,这可能是因为位图对象的分配/计数方式很奇怪。 Bitmap.recycle 似乎有利于让 GC 更快地收集该对象。
无论如何,你都不会leak记忆如果你不打电话Bitmap.recycle
只要您不意外保留硬引用即可。你可能会遇到OutOfMemoryErrors
如果您尝试一次分配太多位图或太大的位图而不调用recycle
, 尽管。
编辑:值得注意的是,从 Android 3.0 开始,位图不再分配在本机内存中。它们像任何其他 Java 对象一样分配在 VM 堆上。不过,我所说的不需要调用回收仍然适用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)