gpt4 book ai didi

ios - iPhone 内存警告和崩溃 - 但仪器显示低内存使用

转载 作者:可可西里 更新时间:2023-11-01 03:52:58 25 4
gpt4 key购买 nike

我有一个奇怪的内存问题,我在解决问题时遇到了问题,希望能得到一些关于其他地方的建议。

我的程序(iPhone 应用程序)有一个功能,它基本上可以下载大量文件,处理 JSON 文件,然后将其余部分存储到磁盘。 JSON 处理是 CPU 密集型的,每个文件可能需要几秒钟,所以我有一个 maxConcurrency 限制为 1 的 NSOperationQueue 来处理所有繁重的工作,还有一个队列来管理要下载的多个文件。

自从 iOS5 发布以来,应用程序在完成下载序列时遇到了问题而没有崩溃,到目前为止我已经尝试过;

1) 将 performSelectorOnBackgroundThread JSON 处理更改为使用单个 NSOperationQueue,以限制处理大型对象的后台线程数量。

2) 在创建多个大型 transient 对象的循环中添加了 NSAutoReleasePools。

3) 刷新 sharedURLCache 以确保文件不会在系统缓存中徘徊。

4) 使用 NSKeyedArchiver 将 JSON 对象存储到磁盘,并在线程之间传递文件名而不是实际对象,再次尝试减少当前正在使用的保留对象的数量和大小。

所有这些一开始似乎有所不同,当我查看内存分配时,我现在已经将峰值使用量从刚刚超过 20MB(因此它崩溃也就不足为奇了)降低到不到 10MB,但是该应用程序仍然像以前一样因内存不足而崩溃。

我正在尝试追踪导致应用程序崩溃的内存占用情况,在这种情况下,我在说服 Instruments 告诉我任何有用的信息时遇到了真正的问题。

这是典型的轨迹(在运行 iOS 4.3.5 的 iPhone 3GS 上)

enter image description here

您可以看到 PEAK 使用量略高于 7MB,但不久之后,您可以看到 2 个与内存不足相关的标志,然后是内存不足紧急标志,随后应用程序很快终止。

如果我使用内存监视器,崩溃的原因似乎很清楚——物理内存正在耗尽——看看下面的浅绿色痕迹。低内存警告与物理内存耗尽同时发生(不足为奇)。

enter image description here

也没有显示 FWIW 的泄漏(我在其他运行中也这样做过)。

这不是图像缓存或 NSURLConnection 缓存,我唯一能想到的是可能有一些未检测到的不良泄漏......但我在识别它们时遇到了问题,因为如果我点击所有分配查看事件的对象,然后执行 command-A 将它们全部选中(以便将它们粘贴到电子表格中以查看内存似乎在哪里),此时我按下 command-C 复制它们,仪器沙滩球,永远不会恢复。

我真的想不通这是怎么回事。有没有人对如何说服仪器向我显示一些有关使用此内存的更有用的信息有一些建议?

抱歉,我无法发布任何有意义的代码片段……希望仪器屏幕截图至少能让您了解我的来源。

最佳答案

Leaks 工具对于找出应用程序中明显的泄漏以外的任何东西都不是很有用。

您所描述的是堆快照分析的理想选择。

tl;博士 Heapshot analysis允许您准确查看应用程序的堆在任意两个时间点(您确定时间点)之间的增长情况。

关于ios - iPhone 内存警告和崩溃 - 但仪器显示低内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8316169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com