objective-c - 如何追踪内存峰值? (这是带有 p 的峰,而不是 l。)

标签 objective-c ios memory-management instruments memory-profiling

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

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

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

enter image description here

我担心有几个原因。

  1. 运行开始时的奇怪模式。
  2. 分配 似乎 达到 1.47 兆字节的峰值,但整夜运行它表明它实际上会随着时间的推移慢慢使用越来越多的内存。这可不是什么好事。

旧项目和新项目之间有几个显着差异。

  • 旧项目使用 Plists 作为后备存储(我手动读写 plist 文件。)新项目使用 Core Data。

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

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

  • 旧项目在多个地方使用了字符串常量。新代码对同一事物使用大量枚举。 (新代码一般使用更多常量。)

如何追踪内存峰值?当应用程序丢弃正在使用的任何内容时,内存全部被应用程序清理,但在应用程序终止之前它似乎不会丢弃任何东西。

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

编辑:

看起来峰值是由调用 KosherCocoa 引起的图书馆。如果有人介意看一下它并告诉我在内存管理方面我做错了什么,我将不胜感激。

最佳答案

What can I do to track down memory peaks? The memory is all being cleaned up by the application when it discards whatever it's using, but it doesn't seem to be discarding things.

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

要修复它,您需要确保您的对象图在您的应用程序运行时得到适当的修剪。缓存通常应该使用限制缓存大小的最近最少使用的 [LRU] 修剪算法。如果缓存键失效,则该数据也应该被删除。

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

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

我写了一份详细的“操作方法”指南; When is a Leak not a Leak?

关于objective-c - 如何追踪内存峰值? (这是带有 p 的峰,而不是 l。),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6899755/

相关文章:

objective-c - XCode 6.4 抛出未将 Objective-C 函数转换为 Swift 的错误

objective-c - Sprite 表 : tool to get coordinates

ios - Swift Facebook SDK 登录按钮位置

objective-c - 核心数据:NSPredicate,对象由实体对象组成

ios - 内存管理何时使用release

c - c中的mmap函数可接受的数据的最大大小是多少?

ios - 加载存储在 plist 中的数组

objective-c - 无法在 Mac 上使用 ARC 使用 respondsToSelector

android - react-Native 更改平面列表中所选项目的颜色

c - C 中的 for 循环中的变量 x 发生了什么?