查找和调试废弃内存和堆增长的提示

时间:2010-10-25 03:14:52

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

我最近观看了WWDC 2010视频之一:第311节 - 使用乐器进行高级内存分析。链接为here

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

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

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

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

但是,在确定我的代码中已经放弃了内存之后,我发现很难确切地知道它来自哪里。

我正在寻找一些寻找遗弃记忆的好方法或资源。

谢谢!

2 个答案:

答案 0 :(得分:5)

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

Using Instruments to track abandoned memory

所以我们在这里得到的是一个人为的例子,每当用户点击一个按钮时我就会分配一个1MB的NSMutableData。在中下方窗格中,我有4个快照,并且我有一个扩展显示自上次快照以来创建但未发布的对象。我突出显示了一个1.25MB的“非对象”分配,在右侧窗格中,它显示了发生此分配的确切调用堆栈。关于右侧面板的一个技巧是沿底部的滑块 - 它控制堆栈帧的消除。如果要查看所有堆栈帧,请将其一直拖到右侧。灰色框架是那些没有源代码的框架,而非灰色框架是您的代码(或者您有代码和源代码的代码。)(另外,如果您没有看到面板上的右键,检查工具栏中的“查看”按钮。)您还在寻找其他哪些信息?

答案 1 :(得分:1)

总结bbum's excellent blog post

  1. 使用工具
  2. 配置您的应用
  3. 使用分配模板
  4. 当应用未运行时,点击Allocations轨道标题旁边的小i,然后选中记录引用计数;这将告诉您项目的保留位置,而不仅仅是它们的分配位置。
  5. 运行您的应用,执行某些操作,然后返回默认状态。例如,打开一个新文档窗口,然后将其关闭。
  6. 单击“仪器”中的“标记堆”按钮。
  7. 重复步骤4和5几次。
  8. 当您查看Instruments中的分配时,可以单击右箭头按钮查看该实例的事件历史记录,包括分配,保留,释放和自动释放的所有位置。