是否需要在使用后调用Bitmap.recycle()(在Android中)?

时间:2013-08-26 20:08:24

标签: android bitmap recycle

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

  

释放与此位图关联的本机对象,然后清除   参考像素数据。这不会释放像素数据   同步;它只是允许它被垃圾收集,如果有的话   没有其他参考。位图标记为“死”,意思是它   如果调用getPixels()或setPixels(),则会抛出异常   什么都不会。这个操作无法逆转,所以应该如此   只有在你确定没有进一步的用途时才被调用   位图。 这是一个高级调用,通常不需要调用,   因为正常的GC过程会在没有时释放这个内存   更多对此位图的引用。

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

让我感到困惑:使用后是否需要拨打Bitmap.recycle()

4 个答案:

答案 0 :(得分:18)

取决于。

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

但是,如果您在旧版本上运行您的应用程序,因为GC无法很好地监控位图(它认为它们是参考的大小),您可以获得OOM,如Google IO讲座所示{{ 3}}

在任何情况下,仍然建议您在确定不再需要位图时立即调用回收。它甚至适用于新的Android版本,因为它降低了自动内存管理所需的工作......

事实上,我记得我曾问过类似的问题here

此外,如果您需要使用JNI进行额外的位图控制,请查看here

因此,简而言之,答案是不再需要它,但仍然建议。


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

答案 1 :(得分:1)

没有必要,但强烈推荐!它将加速内存释放过程,并在内存不足的情况下为您节省酷刑。

如果你要对Bitmaps进行任何严肃的记忆工作,我会说这是强制性的。

答案 2 :(得分:0)

之前的Android 3.0 Bitmaps会分配本机内存来存储它的像素,而recycle()会调用该区域中的delete。

即便如此,如果仍有任何参考,GC也不能保证释放内存。

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

答案 3 :(得分:0)

根据我的经验,我们在生产代码中运行了沉重的位图压缩,并且在没有调用recycle()的情况下,在旧的Lollypop设备中遇到了许多OOM异常,然后将其添加到代码中, OOM的百分比显着降低。