Android - 位图和内存管理?

时间:2012-01-25 01:07:49

标签: android garbage-collection bitmap

我在很多样本中看到,开发人员在位图上调用recycle(),然后将其设置为null。 为什么这是必要的,垃圾收集器是否负责释放位图?

Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
bitmap.recycle();
bitmap = null;

4 个答案:

答案 0 :(得分:17)

加入俱乐部。它有点但不完全。

事实上,在前Honeycomb版本的Android中,位图的内存是从非托管内存分配的,这会产生各种各样的问题。它仍然是从位图对象实现的终结器发布的。这意味着至少需要2次GC通过才能收集它。如果由于某种原因终结器无法执行 - 你得到了图片。另一件事是 - 它真的很难追踪 - DDMS没有看到它,也没有MAT

对于Android 3.0,这已经改变,位图是通过托管字节数组实现的,但对于旧款手机......

答案 1 :(得分:3)

bitmap.recycle();释放位图中使用的本机堆。将其设置为null是为了帮助GC快速收集您的引用。

答案 2 :(得分:1)

来自http://developer.android.com/reference/android/graphics/Bitmap.html#recycle%28%29的文档。


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


所以似乎没有必要打电话。我曾经听说过需要手动将对象设置为null的唯一一次是它是一个静态变量(或者一些不会轻易超出范围的变量)并且你想要强制它没有内存。也许如果你不断快速分配位图,可能需要尝试强制垃圾收集,但对于大多数情况,可能不需要它。

答案 3 :(得分:0)

This article from android development docs有很多关于此主题的信息。如果您正在使用多个位图,请查看有关缓存的文章。