使用Instruments的工具
iOSXcodeInstrumentsInstruments是一个官方提供的强大的性能调试工具集。
1.Blank(空模板):创建一个空的模板,可以从Library库中添加其他模板;
2.Activity Monitor(活动监视器):监控进程的CPU,内存,磁盘,网络使用情况 是程序在手机运行真正占用的内存大小
3.Allocations(内存分配):跟踪过程的匿名虚拟内存和堆的对象提供类名和可选保留/释放历史;
4.Cocoa Layout 观察NSLayoutConstraint对象的改变,帮助我们判断什么时间什么地点的constraint是否合理
5.Core Animation(图形性能)这个模块显示程序显卡性能以及CPU使用情况
6.CoreData 这个模块跟踪Core Data文件系统活动
7.Counters 收集使用时间或基于事件的抽样方法的性能监控计数器(PMC)事件 ?
8.Energy Log 耗电量监控
9.File Activity 检测文件创建,移动,变化,删除等
10.Leaks(泄漏):一般的措施内存使用情况,检查泄漏的内存,并提供了所有活动的分配和泄漏模块的类对象分配统计信息以及内存地址历史记录;
11.Metal System Trace (Metal API是apple 2014年在ios平台上推出的高效底层的3D图形API,它通过减少驱动层的API调用CPU的消耗提高渲染效率。
12.Network 用链接工具分析你的程序如何使用TCP/IP和UDP/IP链接
13.OpenGL ES Analysis 这个模块测量分析OpenGL ES活动正确性检测以及表现问题,提供解决建议
14.System Trace 系统跟踪,通过显示当前被调度线程提供综合的系统表现,显示从用户到系统的转换代码通过两个系统调用或内存操作
15.System Usage 这个模板记录关于文件读写,sockets,I/O系统活动, 输入输出
16.Time Profiler(时间探查):执行对系统的CPU上运行的进程低负载时间为基础采样。
17.Zombies 测量一般的内存使用,专注于检测过度释放的野指针对象,也提供对象分配统计,以及主动分配的内存地址历史
常用的有
Leaks,Zombies,Core Animation,Time Profiler,Cocoa Layout,Energy Log,Network
一.Core Animation:
通过联调真机,可以观察到运行时每秒绘制了多少帧(60帧封顶,30帧以下可以感觉到卡顿越低越需要优化):
1.选中Color Blended Layers, 可以得到界面的红绿分布,其中红色的为透明部分,红色部分越多对性能影响越大。
2.监测离屏渲染:
Color Offscreen-Rendered Yellow
Color Hits Green and Misses Red
看一下淘宝的
二.性能监控计数器Counters
(CPU Samples 操作是会高,不操作时低切稳定,边玩手机边观察,可以看得到CPU的name )
三,Energy Log
耗电量监控 (可以看到手机的WiFi状态,蓝牙状态等等)
四,Leaks
Leaks一个进程占用的内存空间,包括5种数据区:
(1)BSS段:通常存放未初始化的全局变量
(2)数据段:通常存放已初始化的全局变量
(3)代码段:存放程序执行代码
(4)堆:存放进程运行中被动态分配的内存段,如OC对象等
(5)栈:由编译器自动分配释放,存放函数参数,局部变量等
Analyze-静态分析
检测出的常见的三种泄露
(1).创建了对象没有使用。
(2).创建了对象,且初始化了,但初始化的值一直没有读取过。
Value store to ‘X’during its initialization is never.
(3).Potential leak of an object stored into ‘XX‘* 。 翻译一下:XX对象的内存单元有潜在的泄露风险。
product ——> Analyze就可以进行静态的内存分析了(或者鼠标左键长安运行按钮的右下角切换到Analyze模式)
Allocations是检测程序运行过程中的内存分配情况的。模板中一个叫(分配)Allocations,以及一个被称为VM Tracker(虚拟机跟踪)。
Allocations可以帮助我们查看全局内存使用情况(Overall Memory Use): 从全局的角度监测应用程序的内存使用情况,捕捉非预期的或大幅度的内存增长。
内存泄漏使用Leaks检测,如果对象发生内存泄漏,detail panel 中会看到对象的retain release历史记录,如果非对象发生内存泄漏,就会看到malloc和free的调用历史。
1.选中Leaks Checks,在Details所在栏中选择CallTree
2.Call Tree会给我们大概的位置,有时候会给我们精确的位置,选中出现内存泄漏的区域,缩小范围,筛选数据。
3.且在右下 Display Settings 中勾选 Invert Call Tree 和 Hide System Libraries 或其他选项可以过滤显示的数据。
4.在导航栏的筛选框中,我们可以输入关键字来筛选数据。
5.双击人头就可以进去对应得函数进行调优
五,Time Profiler
当点击Time Profiler应用程序开始运行后. 就能获取到整个应用程序运行 消耗时间分布 和 百分比.
使用前须知
1.Time Profiler..:
,,MacMacCPUiOSMacGPUiOSCPUGPUGPUCAEAGLLayerOpenGL. .
2. .
在发布环境打包的时候,编译器会引入一系列提高性能的优化,例如去掉调试符号或者移除并重新组织代码.另iOS引入一种"Watch Dog"[看门狗]机制.
不同的场景下,“看门狗”会监测应用的性能。如果超出了该场景所规定的运行时间,“看门狗”就会强制终结这个应用的进程.
开发者可以crashlog看到对应的日志.但Xcode在调试配置下会禁用"Watch Dog".
六、查找野指针 Zombies(没怎么用)
在开启ARC后,可以很大程度上避免产生EXC_BAD_ACCESS错误,但也是有出现可能的,比如非NSObject对象的产生的野指针。
1.使用Zombies工具,启动Zombies后在内部设置了NSZombieEnabled为True。
启用了NSZombieEnabled的话,它会用一个僵尸来替换默认的dealloc实现,也就是在引用计数降到0时,该僵尸实现会将该对象转换成僵尸对象。
僵尸对象的作用是在你向它发送消息时,就不会向之前那样Crash或者产生 一个难以理解的行为,而是放出一个错误消息,它会显示一段日志并自动跳入调试器,
因此我们就可以找到具体或者大概是哪个对象被错误的释放了。
基本上通过查看Zombies工具给出的信息找出错误代码行是比较简单的,Zombies也只有在产生EXC_BAD_ACCESS错误时才有用。
参考:
http://www.jianshu.com/p/8dfc477e9d70
http://www.jianshu.com/p/be59588327d5
http://www.jianshu.com/p/2ed69864ea02
http://www.cocoachina.com/ios/20161206/18306.html