【问题标题】:What does calling bitmap.recycle() on API 11+ do?在 API 11+ 上调用 bitmap.recycle() 有什么作用?
【发布时间】:2012-08-10 20:53:46
【问题描述】:

我知道在 Android 的 API 10 之前,为不再使用的 Bitmaps 调用 recycle() 很重要,因为实际的原始数据存储在本机内存中。

但是,从 API 11 开始,Bitmaps 存储在堆中,所以我的问题是:

如果 API 足够大(至少 11 个),是否还需要在 Bitmaps 上调用 recycle()?如果我在这样的 API 上调用它会做什么?

【问题讨论】:

  • 当您说“在 API 10 之前调用 recycle() 很重要”时,这是否意味着如果您不这样做,内存将永远不会被释放?官方文档说它是“推荐的”,但如果它在本机内存中分配位图,我不明白如何在不调用 recycle() 的情况下释放它。
  • @Tiago 你可以看这个讲座:youtube.com/watch?v=_CruQY55HOk#t=656。位图在堆中占据了非常小的空间,但它们的像素数据没有(但它是堆的 OOM 机制的一部分),所以 GC 不知道情况的好坏,以及是否是创建多个位图时触发,您可以轻松获得 OOM。这就是为什么调用“回收”很重要,以便它尽快清理位图(因为 GC 没有做好它的工作)。
  • 啊,我明白了。这解释了很多。奇怪的是,OutOfMemory 异常会同时计入堆和本机内存,而 GC 只会查看堆。一旦来自 Honeycomb+,位图的像素数据也在堆中,那么 GC 就可以正确地完成它的工作。什么乱七八糟的,嘿嘿!感谢您的澄清!
  • @Tiago 是的,我不知道他们在遇到这种奇怪行为时在想什么。如果你确实希望通过 JNI 存储位图,你可以试试我的小而简陋的库:github.com/AndroidDeveloperLB/AndroidJniBitmapOperations。可以在此处找到如何导致应用程序从 JNI 泄漏内存(以及它导致的原因)的示例:code.google.com/p/android-developer-preview/issues/…

标签: android bitmap android-3.0-honeycomb heap-memory recycle


【解决方案1】:

官方文档告诉 recycle() 现在是一个高级调用,所以如果你想释放你的位图,你可以写像 bitmap = null 这样的东西,GC 会处理其他所有事情。

【讨论】:

  • 我明白了。所以回收仍然会立即释放它的内存吗?
  • 是的,recycle 会释放内存而不是看 GC,所以你必须小心这个调用。
猜你喜欢
  • 1970-01-01
  • 2015-04-21
  • 2018-05-14
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
相关资源
最近更新 更多