内存警告但小活字节

时间:2010-05-27 15:56:12

标签: iphone memory-management memory-leaks crash instruments

在我的应用程序中,在重复某些操作(选择图片+处理)几次然后崩溃后,我得到级别1和2的内存警告。

泄漏工具未显示任何泄漏。我也跟随仪器中的分配工具,我的实时字节大约是4 MB,总的来说我分配了113 MB。最多我加载图片时内存可能有20 MB。

由于我必须重复一个动作来实现崩溃,因此很可能是内存泄漏。但是,我不知道如何找到它,因为我的实时字节数为4 MB,应该分配一些东西(除了UIImagePickerController中的小泄漏~100 KB)。

我可以信任多少内存泄漏/分配工具?你有建议帮我找出问题的原因吗?

1 个答案:

答案 0 :(得分:2)

我不知道iPhone OS是如何工作的,所以这基本上只是猜测,但在没有垃圾收集器压缩堆内存的系统中,它会随着时间推移而碎片化。拥有大量内存并不意味着许多连续内存是免费的。

例如,如果您总是需要4MB内存进行某些处理,并且您有这种分配模式:

  • 分配4MB
  • 分配1KB
  • 免费4MB
  • 分配1KB

(你不释放1KB的块,因为它是计算结果,或其他)

你可能最终只有3,999K的免费连续内存 - 所以下次你分配4MB时,它将位于差距之后,即使几乎适合。这意味着即使几乎整个内存(或更确切地说,寻址空间)都是空闲的,您也可能会耗尽内存。

当然,现代系统不应该遇到这个问题,但它们可能会,特别是如果应用程序永远不会关闭并且没有压缩的垃圾收集器。请注意,某些系统具有低碎片堆,特别是对于这种情况(重新分配和释放相同大小的块),但您通常需要明确请求它。