Android解除分配Bitmaps进入“未知”内存

时间:2012-11-04 08:09:35

标签: android memory bitmap garbage-collection ddms

我正在制作一个草图应用程序,主要是为了好玩。但我遇到了一个问题。

在我的应用程序中,用户可以“翻转”他们已经绘制的草图。这些草图只是400x800位图。但我经常遇到内存错误。

一旦用户从它们中翻转,草图就会保存到SD中,然后将其取消分配给...

if(bitmap != null)
{
bitmap.recycle();
bitmap = null;
}

因此,在保存和取消分配之前,在任何给定时间只应将一个或两个位图加载到内存中。通过一些调试打印,我已经确定这是真的(同时内存中最多两个位图)。我的问题是,在14次加载/解除分配后,程序崩溃并出现OutOfMemoryError。无论我在“翻转”之间等待多久,总是14岁。

我尝试打开DDMS以查看设备的内存分配情况。奇怪的是,每次取消分配图像时,内存都会转到“未知”部分,而不是“自由”部分。这种情况一直持续到只剩下一小段“空闲”内存,此时发生崩溃(并且“未知”内存变为“空闲”)。

经过大量的谷歌搜索后,我发现了一些资源,表明位图应该是deallocated as expectedDalvik garbage collections always occur before an out of memory error。还有一些杂项页面表明Bitmap使用的所有内存都在GC上解除分配(本机和JVM堆相似)

此时我应该注意,我正在测试两部不同的手机。摩托罗拉Droid X(股票图像,Android 2.3.3)和三星Galaxy S3(Cyanogenmod 9,Android 4.0.4)。两者都表现出完全相同的行为。我的android工具是所有SDK版本的最新版本,我已经检查了一百万次以确保我的代码中没有其他任何东西做任何奇怪的分配(实际上在程序启动后没有分配任何内容)。

那么,我应该如何正确释放一个Bitmap以便它被释放(不仅仅是“未知”),我可以在其他地方使用内存? 作为一种补充问题,这个“未知”的内存池是什么,它的用途是什么?

编辑:语法和拼写,在平台上添加了一些注释。

1 个答案:

答案 0 :(得分:0)

使用大图像(也靠近1mb)。您可能在应用程序标记集大堆true中使用androidmanifest而不是使用自定义View不使用imageview(因为太复杂且需要比其他视图更多)