寻找和调试废弃内存和堆增长的技巧

7
我最近观看了WWDC 2010视频之一:Session 311 - 使用Instruments进行高级内存分析。链接在这里

视频中有一个有趣的例子,讲述如何找到Abandoned Memory(废弃内存)。他们说,调试比泄漏更重要,但可能更难。

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

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

找到Abandoned Memory的主要方法是使用Allocations instrument拍摄堆快照。

然而,在确定我的代码中存在废弃内存后,我发现很难确切地找出它来自哪里。

我正在寻找一些好的提示或资源来找到Abandoned Memory。

谢谢!


5
这个链接对你可能会有帮助:http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/。 - bbum
太好了,正是我在寻找的东西。 - Jonah
当你已经完成项目时,想要找到问题非常困难,但Instruments是极好的帮助。最好的可能性是不产生任何内存泄漏——只要采用良好的编码规范,就不会出现泄漏问题。 - Sulthan
2个回答

5
在Instruments中,您可以为由heapshot标识的任何对象获取调用堆栈。如下截图所示: 使用Instruments跟踪废弃内存 这是一个刻意制造的情境,每次用户点击按钮时,我都会分配1MB的NSMutableData。在中心底部面板中,我有4个heapshot,其中一个被展开以显示自上次heapshot以来已创建但未释放的对象。我突出了1.25MB的“非对象”分配,在右侧面板中,它向我展示了发生此分配的确切调用堆栈。关于右侧面板的一个技巧是沿着底部的滑块,它控制堆栈帧的消除。如果您想看到所有堆栈帧,请将其拖到最右边。灰色的框架是那些没有源代码的框架,非灰色的框架是您的代码(或您同时拥有符号和源代码的代码)。 (此外,如果您没有看到右侧面板,请检查工具栏中的“查看”按钮。)您需要查看哪些其他信息?

这将向您展示有问题的对象被分配的位置。然而,废弃内存的问题在于您想找出所有保留它的地方。ARC使这变得困难,因为这些地方在您的代码中变得不可见。 - benzado
仪器还可以向您展示对象在哪里被保留、自动释放和释放。在ARC时代,它的服务更加重要。 - ipmcc

1

总结bbum的博客文章

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

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


3
我认为“Mark Heap”按钮已被更名为“Mark Generation”。 - dwlz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接