如何用仪器分析内存使用情况和性能?

在所有的仪器跟踪模板中,我喜欢使用:

  • 僵尸来检测对象被过度释放的地方,非常适合debuggingEXEC_BAD_ACCESS错误。
  • 泄漏检测内存泄漏。
  • 核心animationw彩色混合图层检测帧率和半透明子视图,非常适合平滑UITableView滚动。

我总是听到有人说我们的应用程序的内存使用情况和性能。

  1. 为什么要分析内存使用情况和性能? 我的应用运行良好。
  2. 我该怎么做?

我已经使用Allocations,看到我的iPhone应用程序从1 MB的总分配内存开始,并在正常使用后增长到​​5 MB。 iPhone上的内存使用量是多less? iPad的? 苹果电脑?

为了回答这个问题,分析内存使用情况对iOS应用程序尤其重要,因为iPhone和iPad的内存less于Mac。 iPhone 4有512 MB的内存,但早期版本有256或128 MB。 操作系统使用的RAM和多任务的因素,你的应用程序没有太多的内存浪费,所以重要的是要知道你的应用程序使用多less内存。

性能分析通常是在您的应用程序运行缓慢时进行的。 对其进行configuration以查找代码中的缓慢点,以便使代码运行得更快。 如果您的应用运行良好,则不需要进行性能分析。

要回答这个问题,请使用Allocations工具来测量内存使用情况。 “全部分配”类别中的“实时字节”列会告诉您应用程序当前使用的内存量。 分配工具的堆积分析可以衡量您的应用程序的内存增长情况。 使用跳转栏左侧的菜单进行堆积分析。

Time Profiler仪器会分析您的应用程序的性能。 使用Time Profiler工具的难点在于解释结果。 Time Profiler工具不会告诉你你的应用程序花费了75%的时间在函数X中。你必须挖掘数据来find代码中的慢点。

关于可接受的内存使用情况,取决于您想要支持的设备和应用程序。 像使用100 MB的RAM的Xcode应用程序可以,但像一个单页文件使用100 MB的文本编辑应用程序将是一个问题。 5 MB不应该是一个iOS应用程序的问题。

为了解决Mark的回答中的一些评论:

分配活动字节不包括由CALayer / UIViews使用的OpenGL纹理内存。 这是与内存监视器不一致的根源。

在这里看到这个问题的答案: 了解iPhone上的内存消耗

真正加载到设备物理内存中的Resident MemoryVM Tracker InstrumentResident Memory

Allocation Instrument只标记由malloc/[NSObject alloc]创build的malloc/[NSObject alloc]和一些框架缓冲区,例如解压缩的图像位图不包含在Allocation Instrument但它总是占用大部分内存。

请观看WWDC 2012 Session 242 iOS应用程序性能:内存获取来自Apple的信息。