iOS内存详解之使用Instruments分析内存

Instruments是功能强大且灵活的性能分析和测试工具,是Xcode工具集的一部分。它可以帮助我们分析iOS,watchOS,tvOS和macOS的应用程序,以便更好地了解和优化应用程序的行为和性能。从应用程序开发过程开始,将Instruments集成到的日常工作流程中,可以帮助我们在开发周期的早期发现问题进行优化解决,从而节省更多的时间。

在Instruments中使用分析模板来分析应用程序。分析模板是一个跟踪文档,该文档已预先配置了用于执行常见类型跟踪的设置。当启动Instruments,创建新文档或从Xcode启动跟踪时,可以使用分析模板。如果有更高级或自定义的需求,也可以创建自己的模板。 内存追踪

我们主要介绍Allocations模板和Leaks模板,用来查看内存使用情况和寻找内存泄漏。

一、查看APP内存使用情况

Allocations概要分析模板使用Allocations和VM Tracker工具来测量应用程序中的常规和虚拟内存使用情况。大概操作步骤如下:

  1. 启动仪器。
  2. 在显示的性能分析模板选择对话框中,单击“Allocations.”模板。 如上图
  3. 从目标设备和进程列表中选择您的设备和应用程序。
  4. 单击“选择”以创建跟踪文档。
  5. 单击时间线窗格中的“Allocations.”工具。查看内存实时使用情况。

应用内存分布

在上面的菜单中对应的分别是:Persistent Bytes: 内存占用大小, Persistent:内存中该对象个数,Transient:释放过的对象个数,Total Bytes: 总共占用的内存大小等 在左下输入框输入关键词可以过滤

过滤内存

  1. 点击“Mark Generation”按钮显示在详细信息窗格底部的过滤器和配置栏中。
  2. 单击工具栏中的“录制”按钮(或按Command-R)开始录制。
  3. 在您的应用中执行一系列可重复的操作。
  4. 为了准确生成趋势,这应该是一组在相同状态下启动和完成应用程序的操作。
  5. 单击过滤器和配置栏中的“Mark Generation”按钮。
  6. 轨道窗格中将显示一个标志以标识生成。 内存泄漏
  7. 您标记的世代列表将显示在详细信息窗格中。每一代都包括自上一代以来发生的分配列表。
  8. 通过将轨道窗格的时间轴中的检查头拖动到所需位置并单击标记生成,您还可以在完成录制后标记世代。
  9. 在监视详细信息窗格的同时多次执行步骤8和9,直到您看到内存是否无限制地增长。
  10. 重要说明:在前几次迭代中,由于缓存可能会发生额外的分配。因此,为了建立基线,创建一些初始世代是很重要的。然后,创建其他代以进行真正的分析。从上图中可以看到C、D、E、F、G、H、I等满足
  11. 当您准备好停止录制时,单击工具栏中的“停止”按钮(或再次按Command-R)。
  12. 在详细信息窗格中扫描几代,找到一个似乎代表重复内存增长的代码。
  13. Growth和#Persistent列告诉您自上一代以来已经发生了多少额外内存和多少分配。如果您的应用程序在操作后返回其原始状态,您不应期望代代相传。
  14. 单击代的显示三角形,以显示自上一代以来已分配的新对象。
  15. 寻找持久的对象。如果您确定了一个,请单击显示三角形以显示其实例。
  16. 选择一个对象实例。
  17. 按Command-3在检查器的扩展详细信息区域中显示所选实例的堆栈跟踪。如图: 调用栈
  18. 此堆栈跟踪提供了负责分配实例的方法调用的完整列表。
  19. 单击扩展详细信息区域中的“折叠”按钮以隐藏堆栈跟踪中的系统调用。这样可以更轻松地找到应用的方法。如下图: leaks-详情
  20. 您的应用程序拨打的电话颜色为黑色,并且前面有用户代码图标。
  21. 按住Control键并单击详细信息窗格中的条目,在弹出窗口中选择Xcode中的Reveal以在Xcode中显示源。
  22. 屏幕截图显示了在Xcode中打开用户符号的弹出窗口
  23. 确定分配是否有用。如果不是,那就是需要解决的废弃内存。

从图四中我们可以看出每一次快照生成内存都有增加,我们通过输入WM过滤可以看到,相关的未被释放的对象。


二、查看内存泄漏

Leaks概要分析模板使用Allocations 和 Leaks工具来测量应用程序中的一般内存使用情况,并检查泄漏内存,该内存已分配给不再引用和可访问的对象。和查看内存使用情况类似,只需在Instruments启动时选择Leaks模板,如图: leaks

  1. 观察时间线窗格中的Leaks仪器是否有泄漏。泄漏显示为红色条。如下图: leaks1
  2. 单击时间线窗格中的“泄漏”工具以在详细信息窗格中显示与泄漏相关的信息。
  3. 从详细信息窗格的导航栏中的详细信息类型列表中选择“调用树”。
  4. 显示与任何检测到的泄漏相关的方法调用列表。
  5. 单击过滤器和配置栏中的“调用树”按钮。
  6. 在出现的弹出框中,选择“反转调用树”和“隐藏系统库”。
  7. 首先显示最近的方法调用。它还有助于将方法调用列表缩小到您的应用程序所做的调用。您的应用程序调用的方法调用黑色,并在用户代码图标前面。如图: leaks2
  8. 在调用树中,选择要调查的方法调用。
  9. 按Command-3在检查器的扩展详细信息区域中显示所选方法调用的堆栈跟踪。 leaks3

选择Cycles & Roots > Leak Cycles 还可以查看循环引用引起的内存泄漏问题,可以查看具体的循环引用代码,并给出了对象循环引用图。如下: leaks4


三、总结

Instruments工具能够帮助我们查看APP的内存使用情况,以及内存使用中的问题。在APP的开发过程中我们可以时不时的使用Instruments来检查内存使用情况,及时发现问题并解决。


参考链接

Instruments Help