gpt4 book ai didi

android - Bitmap、Bitmap.recycle()、WeakReferences 和垃圾回收

转载 作者:IT老高 更新时间:2023-10-28 22:16:39 28 4
gpt4 key购买 nike

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

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

对吗?

如果这是真的,当使用 Wea​​kReferences 时,肯定会发生内存泄漏,因为当 WeakReferences 被释放时,Bitmap.recycle() 永远不会被调用。或者,不知何故,WeakReferences 是否足以避免内存泄漏?

谢谢

最佳答案

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

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

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

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

关于android - Bitmap、Bitmap.recycle()、WeakReferences 和垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4959485/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com