代码之家  ›  专栏  ›  技术社区  ›  Alexey

找不到内存泄漏的来源

  •  1
  • Alexey  · 技术社区  · 14 年前

    我正在编写一个应用程序(基本上是另一个iBooks克隆),它消耗了大量内存。根据输入数据的不同,它的内存占用可能高达70-80MB(MemoryMonitor状态),甚至更多。
    它在相当长的一段时间内运行良好,但随着时间的推移,它往往会增加内存占用。
    假设你打开一本书,应用程序的内存占用从6MB增加到60MB。然后,应该发生的是,你关闭这本书,内存占用回到6MB。但事实并非如此。它会下降到~30MB(根据MemoryMonitor),这只需几次迭代就会导致崩溃。


    我试过使用leaks工具,但它们显示我总共只有2-3KB(应该是~24MB+)。此外,我并不担心仪器实际上告诉了我真相。我已经仔细检查了仪器报告的所有泄漏,我99%确定那里没有泄漏。
    我也尝试过使用openglES profiler作为资源字节图,但它也没有显示任何泄漏或其他可疑的内容。
    我唯一信任的工具是内存监视器,因为当我的应用程序显示使用了110MB的实际内存时,它总是会崩溃。但是,a)它没有显示分配内存的内容;b)当我尝试用同一个应用程序构建运行它几次时,我发现它的读数在不同的运行之间有很大的差异(在执行完全相同的操作时有15-20MB的差异)。

    所以所有的仪器都告诉我,我的代码是好的(除了内存监视器,它似乎是正确的,但对任何测量都没有用),但它不断压榨。
    我不知道下一步该怎么办。我当然不能再减少总的内存占用,也找不到内存泄漏(我想这仍然是要走的路)。



    2) 我读过一些碎片整理的问题,比如当你分配/重新分配许多对象,然后应用程序不返回释放的块回操作系统,这可能会导致无法分配大内存块,因为它是太零碎,操作系统不会给你更多的内存。我从来没有看过一个好的话题。如果有人能腾出一个相关主题的链接,那就太棒了。
    3) 我尝试过禁用程序的几个部分,到目前为止,看起来整个问题可能来自使用CoreText框架。我想听听那些曾经大量使用过这个框架并且能够确认/否认存在任何问题的人的意见。
    4) --还有其他建议吗--

    2 回复  |  直到 14 年前
        1
  •  2
  •   Kalle    14 年前

    也许有点傻,但当类似的事情发生在我身上时,我意识到我启用了NSZombies。从那时起,我的didFinishLaunching:在顶部有以下几行:

    if (getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) {
        NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");
    } else {
        NSLog(@"No NSZombieEnabled or NSAutoreleaseFreedObjectCheckEnabled");
    }
    
        2
  •  0
  •   Kendall Helmstetter Gelner    14 年前

    问题是,泄漏只会找到仍然保留的内存,而您没有引用这些内存。

    在您的情况下,您仍然保留了内存,您也有引用。至于泄漏,它不能告诉你是否要保留记忆,所以它什么也没说。

    在您的情况下,最好的方法是使用Object Alloc工具记录一个会话,然后选择内存增长的区域,然后选择旁边的“retained and still living”选项。现在检查报告的对象,找出哪些仍然保留,哪些不应该保留—一个好的起点是查找您自己仍然保留的任何类,并找出您认为已释放的类。