我正在制作一个素描应用程序,主要是为了好玩。但我遇到了一个问题。
在我的应用程序中,用户可以“翻转”他们已经绘制的草图。这些草图只是 400x800 位图。但是我经常遇到内存不足的错误。
一旦用户离开草图,草图就会被保存到 SD 中,然后它们会被释放...
if(bitmap != null)
{
bitmap.recycle();
bitmap = null;
}
因此,在任何给定时间,在保存和释放它们之前,只应将一两个位图加载到内存中。通过一些调试打印,我确定这是真的(内存中最多同时有两个位图)。我的问题是,在 14 次加载/释放后,程序崩溃并出现 OutOfMemoryError。总是 14,无论我在“翻转”之间等待多长时间。
我尝试打开 DDMS 来查看设备的内存分配情况。奇怪的是,每次释放图像时,内存都会进入“未知”部分,而不是“空闲”部分。这种情况一直持续到只剩下一小部分“空闲”内存,此时发生崩溃(并且“未知”内存变为“空闲”)。
经过大量谷歌搜索,我发现一些资源说位图应该按预期释放,并且Dalvik 垃圾收集总是发生在内存不足错误之前。还有一些杂项页面表明位图使用的所有内存都在 GC 时释放(本机和 JVM 堆类似)
在这一点上,我应该注意,我正在两部不同的手机上进行测试。摩托罗拉 Droid X(库存图片,Android 2.3.3)和三星 Galaxy S3(Cyanogenmod 9,Android 4.0.4)。两者都表现出完全相同的行为。我的 android 工具在所有 SDK 版本中都是最新的,我已经检查了一百万次以确保我的代码中没有其他任何东西在做任何奇怪的分配(实际上在程序启动后没有分配任何东西)。
那么,我应该如何正确释放位图以便释放它(不仅仅是“未知”),并且我可以在其他地方使用内存?作为一个补充问题,这个“未知”的内存池是什么,它的用途是什么?
编辑:语法和拼写,在平台上添加了一些注释。