我正在编写一个消耗大量内存的应用程序(基本上是另一个iBooks克隆)。根据输入数据,它的内存占用量最高可达70-80 MB(如MemoryMonitor所述)或更高。
它在相当长的一段时间内工作正常,但随着时间的推移,它往往会增加其内存占用
因此,假设您打开一本书,应用程序的内存占用量从6MB到60MB。然后应该发生的事情是你关闭书籍,内存占用量回落到6MB。它没有。它下降到大约30MB(根据MemoryMonitor),这导致仅在几次迭代中崩溃。
现在有趣的部分。我已经尝试过clang静态分析仪,但它没有显示任何问题(除了指向单身人士等)
我尝试过使用泄漏仪器,但它们表明我总共只有2-3KB(它应该是~24MB +)。而且,我并不担心文书实际上是在说实话。我仔细检查了仪器报告的所有泄漏,我99%确定那里没有泄漏
我尝试过使用分配工具,但它表明在关闭本书后,内存占用量下降到6MB,这是所需的数字。但这没有多大意义,因为如果是这样,应用程序将永远不会崩溃。
我也尝试过使用openglES profiler for Resource Bytes图表,但它也没有显示泄漏或其他任何可疑的内容。
我曾经信任的唯一工具是内存监视器,因为我的应用程序在显示~110MB实内存时总是会崩溃。但是,a)它没有显示分配内存的内容和b)当我尝试使用相同的应用程序构建运行它几次时,我发现它的读数在不同运行之间有很大差异(15-20MB的差异同时完全是相同)。
所以所有乐器都告诉我我的代码很好(除了内存监视器,它似乎是正确的,但对于任何测量都没用)但是它一直在破碎。
我不知道接下来该怎么办。我当然不能再减少整体内存占用,而且我找不到内存泄漏(这仍然是我猜的方法)。
所以这是我的问题:
1)除了上面提到的那些之外,有没有找到泄漏的方法?另一个iphone的探查器程序可能吗?
2)我已经读过某种碎片整理问题,比如分配/重新分配许多对象,然后应用程序不会将释放的块返回给操作系统,这可能会导致无法分配大块内存,因为它是太碎片了,操作系统不会给你更多的内存。我从来没有见过关于这一点的好主题。如果有人可以找到相关主题的链接,那就太棒了
3)我已经尝试禁用程序的几个部分,到目前为止看起来整个问题可能来自使用CoreText框架。我想听听那些曾经大量使用过这个框架的人,并且可以确认/否认那里存在任何问题
4) - 其他建议 -
P.S。我没有包含任何代码片段,因为代码本身非常庞大,我无法将可疑代码的数量减少到合理的数量。
答案 0 :(得分:2)
或许有点傻,但是当我发生了大致相似的事情时,我意识到我启用了NSZombies。从那时起,我的didFinishLaunching:在顶部有以下两行:
if (getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) {
NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");
} else {
NSLog(@"No NSZombieEnabled or NSAutoreleaseFreedObjectCheckEnabled");
}
答案 1 :(得分:0)
问题是,泄漏只会找到仍然保留但没有引用的内存。
在你的情况下,你仍然保留了你也有引用的内存。就泄漏而言,它无法判断你是否意图保留这种记忆,所以它什么也没说。
在您的情况下,最好的办法是使用Object Alloc仪器 - 记录会话,然后对于增长内存的区域alt-选择区域,并选择侧面的“保留和静止”选项。现在浏览报告的对象,找出仍然保留的不应该是什么 - 一个好的起点是查找仍然保留的任何类,并找出你认为被解除分配的内容。
较新的XCode还有一个结合了泄漏和对象分配的工具,我不能再说什么,因为它在NDA下 - 但你可能想尝试一下。我不知道你是否必须在一个单独的系统上安装它才能访问改进的工具...