如何使用Instruments来分析内存使用和性能?

53

在所有的工具中,我最喜欢使用以下工具追踪模板:

  • Zombies 工具用于检测何处存在对象过度释放的问题,非常适合调试 EXEC_BAD_ACCESS 错误。
  • Leaks 工具用于检测内存泄漏。
  • Core Animation w Color Blended Layers 工具用于检测帧率和半透明子视图,非常适合优化 UITableView 滚动。

我经常听到人们说要分析我的应用程序的内存使用情况和性能。

  1. 为什么要分析内存使用情况和性能呢?我的应用程序运行得很好啊。
  2. 如何进行分析呢?

我已经使用了 Allocations 工具,并查看到我的 iPhone 应用程序在正常使用后总共分配了 1 MB 的内存并增长到了 5 MB。那么在 iPhone、iPad 和 Mac 上,什么水平的内存使用量会被认为是过高的呢?

3个回答

77

回答为什么,对于iOS应用程序来说,分析内存使用情况非常重要,因为iPhone和iPad的RAM比Mac要少得多。 iPhone 4具有512 MB的RAM,但早期版本只有256或128 MB。考虑到操作系统使用的RAM和多任务处理,您的应用程序没有太多可浪费的RAM,因此了解应用程序使用的内存量非常重要。

性能分析通常在应用程序运行缓慢时进行。通过对其进行分析,找出代码中的瓶颈,以便使代码运行更快。如果您的应用程序运行良好,则没有太多需要进行性能分析的需求。

回答如何,使用分配工具来衡量内存使用情况。所有分配类别中的“实时字节”列告诉您应用程序目前使用的内存量。分配工具的堆快照分析可以测量应用程序中的内存增长。使用跳转栏左侧的菜单执行堆快照分析。

时间分析器工具可用于分析应用程序的性能。使用时间分析器工具的困难之处在于解释结果。时间分析器工具不会告诉您应用程序将75%的时间花费在函数X上。您必须查阅数据以找到代码中的瓶颈。

关于可接受的内存使用情况,这取决于您想要支持的设备和应用程序。像Xcode这样使用100 MB RAM的应用程序是可以接受的,但像TextEdit这样为一个页面文档使用100 MB RAM的应用程序将会出现问题。对于iOS应用程序来说,5 MB不应该有问题。


2
感谢您提供如此全面的答案! :) - ma11hew28
7
在确定我的应用程序实际使用了多少内存时,我发现“Allocations”工具往往会给出远低于实际内存使用量的数字,这让人感到误导。如果您查看“Memory Manager”工具中的“Real memory”一列,则可以获得应用程序实际使用的内存量。我曾经开发过一个OpenGL游戏,频繁收到低内存警告。Allocations表明我只使用了12M内存,而Memory Manager显示我正在使用100M内存。就是这样。 - Ian
3
请参考链接https://dev59.com/ZWoy5IYBdhLWcg3wD5_H#8797272。看起来,活动内存(live bytes)更准确,因为内存工具中的“真实内存”列仍显示您很久以前释放但操作系统尚未回收的块。另请参见链接https://dev59.com/x2sz5IYBdhLWcg3w6MTn#7574959,其中我认为总字节数应该与“真实内存”更接近。 - Bob Spryn
1
我们目前正在尝试掌握应用程序一次可以显示多少大型图像的情况。编写了一个测试应用程序,只是在UIScrollView上抛出大型JPG,使用[UIImage imageNamed:]和/或[UIImage imageWithContentsOfFile:],我们发现Allocations仅在应用程序崩溃之前显示了5MB的使用情况,而实际内存使用情况显示约为750MB。因此,在这种情况下,对于我们的目的,实际内存使用情况为我们提供了更有用的信息。 - Dave Klotz

7

针对Mark回答中的一些评论:

分配的实时内存不包括OpenGL纹理内存,这是CALayer/UIViews使用的。这就是与Memory Monitor不一致的原因。

在此处查看有关此问题的答案: 了解iPhone上的内存消耗


3
设备物理内存中实际加载的内存是VM Tracker仪器中的Resident Memory。Allocation仪器仅标记由malloc/[NSObject alloc]和一些框架缓冲区创建的内存,例如,解压缩图像位图不包括在Allocation仪器中,但它总是占用大部分内存。请观看WWDC 2012会议242 iOS应用程序性能:内存,以获取来自Apple的信息。

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