【问题标题】:Tips for finding and debugging abandoned memory and heap growth查找和调试废弃内存和堆增长的技巧
【发布时间】:2011-04-30 00:39:51
【问题描述】:

我最近观看了 WWDC 2010 视频之一:Session 311 - Advanced Memory Analysis with Instruments。链接是here

视频中有一个关于寻找被遗弃的记忆的有趣例子。他们说调试通常比泄漏更重要,但也可能更困难。

Abandoned Memory 被定义为“不再使用的可访问分配的内存”。

泄漏被定义为“无法再访问的分配内存”。

查找 Abandoned Memory 的主要方法是使用 Allocations 工具进行堆镜头。

但是,在确定我在代码中放弃了内存之后,我发现真的很难找出它的确切来源。

我正在寻找一些很好的提示或资源来寻找被遗弃的记忆。

谢谢!

【问题讨论】:

  • 您可能会发现这很有用:friday.com/bbum/2010/10/17/…
  • 太好了,正是我正在寻找的那种东西。
  • 当你已经完成了这个项目时,真的很难找到它,但是 Instruments 可以提供很大的帮助。最好的办法是不进行任何内存泄漏——使用良好的编码标准,您不会遇到泄漏问题。

标签: iphone objective-c memory memory-management memory-leaks


【解决方案1】:

总结bbum's excellent blog post

  1. 使用 Instruments 分析您的应用
  2. 使用分配模板
  3. 当应用程序未运行时,单击 Allocations 轨道标题旁边的小 i 并检查 Record reference counts;这会让您知道项目的保留位置,而不仅仅是分配位置。
  4. 运行您的应用程序,执行某些操作,然后返回默认状态。例如,打开一个新的文档窗口,然后将其关闭。
  5. 单击 Instruments 中的“标记堆”按钮。
  6. 重复步骤 4 和 5 几次。

当您在 Instruments 中查看分配时,您可以点击右箭头按钮查看该实例的事件历史记录,包括它被分配、保留、释放和自动释放的所有位置。

【讨论】:

  • 我认为“标记堆”按钮已重命名为“标记生成”。
【解决方案2】:

在 Instruments 中,您可以获得由 heapshot 标识的任何对象的调用堆栈。截图:

所以我们在这里得到的是一个人为的案例,每次用户点击一个按钮时,我都会分配一个 1MB NSMutableData。在中心底部窗格中,我有 4 个堆,我扩展了一个以显示自上次堆以来已创建但未释放的对象。我突出显示了一个 1.25MB 的“非对象”分配,在右窗格中,它向我显示了发生此分配的确切调用堆栈。右侧面板的一个技巧是底部的滑块——它控制堆栈帧的消除。如果要查看所有堆栈帧,请将其一直拖到右侧。灰色框架是您没有源代码的框架,非灰色框架是您的代码(或您同时拥有符号和源代码的代码。)(另外,如果您没有看到面板上的对,检查工具栏中的“查看”按钮。)您还在寻找什么其他信息?

【讨论】:

  • 这显示了违规对象被分配的位置。但是,废弃内存的问题在于,您想找出所有被保留的位置。 ARC 使这变得困难,因为这些地方在您的代码中变得不可见。
  • 仪器还可以向您显示您的对象被保留、自动释放和释放的任何地方。它的服务在 ARC 时代更加重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
相关资源
最近更新 更多