iPhone内存警告和崩溃 – 但仪器显示低内存使用
我有一个奇怪的记忆问题,我有问题的解决,并希望得到一些build议,看看别的地方。
我有的程序(iPhone应用程序)有一个function,它基本上下载大量的文件,处理那些是JSON,并将其余的存储到磁盘。 JSON处理是CPU密集型的,每个文件可能需要几秒钟的时间,所以我有一个NSOperationQueue,maxConcurrency限制为1,处理所有繁重的操作,还有一个队列pipe理多个文件下载。
自iOS5发布以来,应用程序在完成下载顺序时没有崩溃,到目前为止,我所尝试的是,
1)将performSelectorOnBackgroundThread JSON处理更改为使用单个NSOperationQueue,以限制处理大对象的后台线程的数量。
2)添加NSAutoReleasePools循环内创build多个,大,瞬态的对象。
3)刷新sharedURLCache,确保文件不在系统caching中。
4)使用NSKeyedArchiver将JSON对象存储到磁盘,并在线程之间传递文件名而不是实际的对象,以再次尝试减less当前正在使用的保留对象的数量和大小。
所有这些起初似乎都有所作为,而当我查看内存分配时,现在我已经将峰值使用率从20MB以下(因此难怪正在崩溃)降低到10MB以下,而应用程序仍然像以前一样崩溃。
我试图跟踪什么是吃的内存导致应用程序崩溃,在这个场合我有真正的问题说服仪器告诉我任何有用的东西。
这是一个典型的痕迹(在运行iOS 4.3.5的iPhone 3GS上)
你可以看到PEAK的使用率已经超过了7MB,不久之后,你可以看到有关低内存的2个标志,然后紧急内存不足,随后应用程序不久之后终止。
如果我使用内存监视器,崩溃的原因似乎足够清晰 – 物理内存正在耗尽 – 请看下面的浅绿色迹线。 低内存警告与物理内存耗尽(并不令人惊讶)。
没有泄漏显示FWIW(我在其他运行中已经完成了)。
这不是图像caching或NSURLConnectioncaching,唯一我能想到的是,也许有一些不良的泄漏没有被检测到…但我有问题识别他们,因为如果我点击进入所有分配看到对象是活的,然后执行命令-A将它们全部选中(为了将它们粘贴到电子表格中以查看内存似乎在哪里),在我点击命令C来复制它们,Instruments海滩球和从未恢复。
我真的不知道发生了什么事。 有没有人对如何说服乐器向我展示一些关于使用这种内存的更有用的信息有一些build议?
对不起,我不能发布任何有意义的代码片段…希望仪器截图至less让你知道我来自哪里。
泄漏工具对于搞清楚你的应用程序中的明显泄漏,并不是非常有用。
你所描述的是堆积分析的理想人选。
tl; dr Heapshot分析使您可以准确查看应用程序的堆在任何两个时间点(您确定点的位置)之间的增长情况。