【发布时间】: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