Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何追踪记忆峰值?(s的峰值是p,而不是l。)_Objective C_Ios_Memory Management_Instruments_Memory Profiling - Fatal编程技术网

Objective c 如何追踪记忆峰值?(s的峰值是p,而不是l。)

Objective c 如何追踪记忆峰值?(s的峰值是p,而不是l。),objective-c,ios,memory-management,instruments,memory-profiling,Objective C,Ios,Memory Management,Instruments,Memory Profiling,我有一个kiosk应用程序,它基本上显示了一堆幻灯片,上面有各种各样的信息。我最初是在一年多前开始编写的,当时我刚开始使用Objective-C和iOS开发。我发现现在我的代码风格比以前干净多了,而且我的经验也丰富多了,所以我决定从头开始重写 我用分配工具运行我的应用程序,查看内存使用情况。考虑到这是一个信息亭应用程序,一切都需要顺利运行,没有泄漏。(当然,所有的应用程序都需要在没有漏洞的情况下运行,但kiosk应用程序使这成为一个更重要的目标。)我看到了一些有趣的结果,所以我也运行了旧版本的代

我有一个kiosk应用程序,它基本上显示了一堆幻灯片,上面有各种各样的信息。我最初是在一年多前开始编写的,当时我刚开始使用Objective-C和iOS开发。我发现现在我的代码风格比以前干净多了,而且我的经验也丰富多了,所以我决定从头开始重写

我用分配工具运行我的应用程序,查看内存使用情况。考虑到这是一个信息亭应用程序,一切都需要顺利运行,没有泄漏。(当然,所有的应用程序都需要在没有漏洞的情况下运行,但kiosk应用程序使这成为一个更重要的目标。)我看到了一些有趣的结果,所以我也运行了旧版本的代码

运行较旧版本的代码时,我看到的内存使用量几乎为1.15兆字节。一切似乎都在必要时分配和解除分配。然而,在我的新实现中,我看到了一些不同的东西。内存使用量在小“高原”上不断跳跃,然后最终似乎达到峰值,约为1.47兆字节的使用量。以下是新分配报告在运行超过10小时后的样子:

我担心有几个原因

  • 跑步开始时的奇怪模式
  • 分配的峰值似乎为1.47兆字节,但一夜之间运行它表明,随着时间的推移,它实际上会慢慢使用越来越多的内存。那不可能是件好事
  • 旧项目和新项目之间有几个显著的区别

    • 旧项目使用plist作为后备存储(我手动读写plist文件)。新项目使用核心数据

    • 新项目实现了一个库,在旧项目没有的每个“幻灯片”上调用该库。我会更关心这个库,除非我写了它,并仔细检查它,以确保我发布了所有内容,并且只在手动发布不可能的地方自动发布

    • 这两个类都使用factory类来创建幻灯片。在旧项目中,factory类是一个单独的类。我认为把它变成一个普通的类会有助于解决内存问题,因为singleton从未被释放过。(因此它的属性没有发布。在新项目中,factory类正在发布,所以我不确定为什么它仍然占用所有内存(如果这是导致问题的原因)

    • 旧项目在不同的地方使用字符串常量。新代码为相同的内容使用大量枚举。(新代码通常使用更多常量。)

    我能做些什么来追踪内存峰值?当应用程序丢弃正在使用的任何东西时,内存都会被清除,但在应用程序终止之前,它似乎不会丢弃任何东西。

    如果有人能帮我指出正确的方向,我将不胜感激

    编辑:

    看起来峰值是由对库的调用引起的。如果有人介意看一下并告诉我内存管理方面的错误,我将非常感激

    我能做些什么来追踪记忆的高峰?记忆是全部 当应用程序丢弃它正在使用的任何东西时,它会进行清理, 但它似乎并没有抛弃任何东西

    这是“废弃对象”或“使用量增加”的典型案例。也就是说,您的应用程序在运行时,会在内存中建立一个对象图,作为正常使用的一部分。这些对象不会泄漏,因为它们仍然连接到活动对象图。更有可能的是,这些对象是某种缓存的一部分(通常是只写缓存)或涉及历史状态的机制(撤消堆栈是累积的潜在来源)

    要修复此问题,您需要确保在应用程序运行时适当修剪对象图。缓存通常应使用最近使用最少的[LRU]修剪算法来限制缓存大小。如果缓存密钥无效,则也应修剪该数据

    对于历史信息,删减历史是至关重要的。确保历史数据包含该历史状态的绝对最小表示也是至关重要的

    使用Heapshot分析——创建它是为了帮助准确跟踪这些类型的问题


    我写了一篇详细的“如何”guide;

    +1好问题和好标题!好吧,玩堆照片,我想这与我的循环有关,它会重新加载滚动视图。我发布一些代码后,你能帮我吗?当然可以;发布一个包含详细信息和代码的新问题。我会扩展我的答案,稍后回答这个问题的具体细节。之后r测试和反思,我想我知道问题是什么,但不是答案。我已经发布了。请随意看一看。他们似乎结束了我的另一个问题。如果你不介意,请看看我在这个项目中使用的库。它似乎导致了内存峰值。