2

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

泄漏工具不显示任何泄漏。我也在关注 Instruments 中的分配工具,我的 Live Bytes 大约为 4 MB,我总共分配了 113 MB。加载图片时,我最多有 20 MB 的内存。

由于我必须重复一个动作才能到达崩溃,所以很可能是内存泄漏。但是,我不知道如何找到它,因为我的活动字节是 4 MB 并且应该分配的东西(除了 UIImagePickerController 中约 100 KB 的小泄漏)。

我可以在多大程度上信任内存泄漏/分配工具?你有什么建议可以帮助我找到问题的原因吗?

4

1 回答 1

2

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

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

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

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

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

诚然,现代系统不应该遇到这个问题,但它们可能会受到影响,尤其是在应用程序从未关闭并且没有压缩垃圾收集器的情况下。请注意,某些系统具有低碎片堆,尤其是在这种情况下(重新分配和释放相同大小的块),但您通常需要显式请求它。

于 2010-05-27T16:21:45.970 回答