【问题标题】:Is it needed to call Bitmap.recycle() after used (in Android)?使用后是否需要调用 Bitmap.recycle()(在 Android 中)?
【发布时间】:2013-08-29 10:03:07
【问题描述】:

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

释放与此位图关联的本机对象,并清除 参考像素数据。这不会释放像素数据 同步;它只是允许它被垃圾收集,如果有 没有其他参考。该位图被标记为“死”,这意味着它 如果调用 getPixels() 或 setPixels() 将抛出异常,并且 什么都不会画。此操作不可逆转,因此应 只有在您确定没有其他用途的情况下才会调用 位图。 这是一个高级调用,通常不需要调用, 因为正常的 GC 进程会在没有 对此位图的更多引用。

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

搞得我一头雾水:用完后需要打电话Bitmap.recycle()吗?

【问题讨论】:

  • 当 Bitmap 不被使用时,GC 会释放它,但是调用recycle() 会帮助 GC 检查那部分内存是否空闲。在加载和卸载位图(例如在列表或图库中)时调用 recycle() 可能是一个好习惯

标签: android bitmap recycle


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    视情况而定。

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

    但是,如果您在旧版本上运行您的应用程序,由于 GC 无法很好地监控位图(它认为它们是参考的大小),您可能会出现 OOM,如 Google IO 讲座 @987654321 中所示@。

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

    其实我记得我问过类似的问题here

    另外,如果您需要使用 JNI 对位图进行额外控制,请查看this post

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


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

    【讨论】:

    • 所以即使一个方法完成,并且 BMP 文件失去参考,1.它不会在 android 上完全释放,或者 2.它会逐步收集它的参考,这样就可以了恢复慢?像 Bitmap->PixelArrayData->Pixel 它首先删除没有引用它的位图,然后是 pixelArrayData,第三次启动它自己的像素
    • 只要任何东西仍然持有对它的引用并且可以使用它,它就不会被回收,就像任何其他 Java 对象一样。顺便说一句,我决定在我的回答中添加一个关于 Android 8.0 的注释。
    • 好吧,如果它没有在长时间运行的进程中定义为全局的,比如涉及的类,或者像 while true 循环那样长时间运行,那没关系,在某个时候 gc 应该开始工作,并收集全部或部分......很久以前,当我开始编写我的第一个 C# 应用程序时,我注意到当我逐帧生成位图时,随着时间的推移它会占用一些内存,然后操作系统会清除一些它不是全部(窗口)然后再一次,直到它填满内存,但是如果我没记错的话,使用 GC.Collect,在每一帧之后或一段时间后它会删除整个不必要的
    • 我认为您在 C# 上有一个错误,或者您只是不再真正参考这些位图。我不认为它可以无缘无故地自动放弃位图。同样,如果没有对该对象的引用,则可以释放该对象。它可以在它不可用时立即出现,也可以在一段时间后。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      这不是必需的,但强烈推荐!它将加快内存释放过程,并避免因内存不足异常而遭受折磨。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多