18

根据Android参考文档Bitmap.recycle()

释放与此位图关联的本机对象,并清除对像素数据的引用。这不会同步释放像素数据;如果没有其他引用,它只是允许它被垃圾收集。该位图被标记为“死”,这意味着如果调用 getPixels() 或 setPixels() 将引发异常,并且不会绘制任何内容。此操作无法反转,因此只有在您确定位图没有进一步用途时才应调用它。这是一个高级调用,通常不需要调用,因为当没有更多对该位图的引用时,正常的 GC 进程将释放此内存。

但是,我读过的许多书都建议通过调用 Bitmap.recycle() 来释放内存,确保不再需要它。

这让我很困惑:使用后是否需要调用Bitmap.recycle()

4

4 回答 4

20

这取决于。

如果您在 Android 3.0 及更高版本上运行您的应用程序,则不需要它,因为 GC 会完美处理它。

然而,如果你在旧版本上运行你的应用程序,因为位图没有被 GC 很好地监控(它认为它们是参考的大小),你可能会得到 OOM,如 Google IO 讲座在这里所示。

无论如何,仍然建议您在确定不再需要位图后立即调用回收。即使对于新的 android 版本也很好,因为它降低了自动内存管理所需的工作......

事实上,我记得我在这里问过类似的问题。

此外,如果您需要使用 JNI 对位图进行额外控制,请查看这篇文章

所以,简而言之,答案是不再需要它,但仍然推荐。


编辑:自 Android 8.0 以来,位图存储在本机内存中,因此更难达到 OOM。事实上,这在技术上是不可能的,因为你会遇到其他问题。可以在此处找到有关此的更多信息。

于 2013-08-26T20:41:03.843 回答
1

这不是必需的,但强烈推荐!它将加快内存释放过程,并为您节省内存不足异常的折磨。

如果您要使用位图进行任何严重的内存扩展工作,我会说它是强制性的。

于 2013-08-26T20:31:31.583 回答
1

根据我的经验,我们在生产代码中运行了大量的 Bitmap 压缩,并且在没有调用的情况下,recycle()我们在旧设备中遇到了许多 OOM 异常Lollypop,并且将其添加到代码中后,OOM 的数量大大减少了。

于 2018-12-20T14:57:46.523 回答
0

之前的 Android 3.0 位图分配本机内存来存储它的像素,并且 recycle() 调用该区域中的删除。

即使这样,如果仍有任何引用,GC 也不能保证释放该内存。

但是这个调用看起来有助于 GC 更好地工作,我开发了一个应用程序,它可以大量使用内存并在较新的设备上运行,调用该应用程序或不运行几乎相同的应用程序(对于较旧的它确实提高了一些性能)。

于 2013-08-26T20:40:02.093 回答