【发布时间】:2012-01-09 02:41:10
【问题描述】:
我有一个奇怪的内存问题,我正在解决问题,希望能得到一些关于其他地方的建议。
我拥有的程序(iPhone 应用程序)有一个功能,它基本上可以下载大量文件,处理 JSON 格式的文件,并将其余文件存储到磁盘。 JSON 处理是 CPU 密集型的,每个文件可能需要几秒钟,所以我有一个 NSOperationQueue,maxConcurrency 限制为 1 来处理所有繁重的工作,还有一个队列来管理要下载的多个文件。
自从iOS5问世以来,该应用程序在完成下载序列而没有崩溃的情况下一直存在问题,到目前为止我尝试过的是;
1) 将 performSelectorOnBackgroundThread JSON 处理更改为使用单个 NSOperationQueue 以限制处理大型对象的后台线程数。
2) 在创建多个大型瞬态对象的循环内添加了 NSAutoReleasePools。
3) 刷新 sharedURLCache 以确保文件不会在系统缓存中徘徊。
4) 使用 NSKeyedArchiver 将 JSON 对象存储到磁盘并在线程之间传递文件名而不是实际对象,以再次尝试减少当前使用的保留对象的数量和大小。
起初,所有这些似乎都有所不同,当我查看内存分配时,我现在已经将峰值使用量从刚刚超过 20MB(因此难怪它崩溃)降低到了 10MB 以下,然而该应用程序仍然像以前一样因内存不足而崩溃。
我正在尝试追踪导致应用程序崩溃的内存占用,但在这种情况下,我在说服 Instruments 告诉我任何有用的信息时遇到了真正的问题。
这是一个典型的跟踪(在运行 iOS 4.3.5 的 iPhone 3GS 上)
您可以看到 PEAK 使用量略高于 7MB,但不久之后,您可以看到与内存不足有关的 2 个标志,然后是内存不足紧急情况,随后应用程序很快就会终止。
如果我使用内存监视器,崩溃的原因似乎很清楚 - 物理内存正在耗尽 - 请查看下面的浅绿色迹线。内存不足警告与物理内存耗尽同时出现(不足为奇)。
也没有显示 FWIW 的泄漏(我在其他运行中也这样做过)。
这不是图像缓存或 NSURLConnection 缓存,我唯一能想到的是,可能存在一些未检测到的不良泄漏......但我在识别它们时遇到问题,因为如果我点击所有分配查看活动的对象,然后执行命令-A 将它们全部选中(以便将它们粘贴到电子表格中以查看内存的位置),此时我点击命令-C 复制它们,乐器沙滩球,永远不会恢复。
我真的不知道发生了什么。有人对如何说服仪器向我展示一些有关使用此内存的更多有用信息有什么建议吗?
抱歉,我无法发布任何有意义的代码片段……希望仪器屏幕截图至少能让您了解我的来源。
【问题讨论】:
-
你说你的麻烦是从 iOS 5 开始的,但你的踪迹是在 4.3 上? (而且它有麻烦!)
-
是的,这个问题最初是在 iOS5 上发现的,起初它似乎仅限于 iOS5 设备,但目前在测试期间,它似乎在其他系统上也出现了故障。我认为我们现在正在更仔细地研究它,因此 iOS 版本可能相关,也可能不相关。
标签: ios memory memory-leaks instruments