Instruments检测解决内存泄露以及进行性能测试
1、启动Xcode自带的Instruments。这里有两种方法启动。
方法一:
方法二:
2、选择Leaks选项。(该选项用来进行内存泄漏检测)
说明:
- Leaks:找到引发内存泄漏的起点。
- Time Profiler:分析代码的执行时间,找出导致程序变慢的原因。
- Allocations:监测内存使用/分配情况。迅速膨胀的内存可以很快让程序毙命,所以要多加防范。
3、然后这里选择要测试的app之后,先在Xcode上运行app,再在Instruments上点击左上角“红色圆点”开始运行测试:
正在测试:
4、下面就是定位修改了,此时选中有红色柱子的Leaks,下面有个"田"字方格,点开,选中Call Tree。
显示如下图界面:
5、下面就是最关键的一步,在这个界面的右下角有若干选框,选中Invert Call Tree 和Hide System Libraries,(红圈范围内)显示如下:
6、最后选中显示的若干条中的一条,双击,会自动跳到内存泄露代码处:
补充:
下面进行耗时检测:
1、选择Time Profiler选项
2、照前面的方法选择相应的app后,先在Xcode上运行app,再在Instruments上点击左上角“红色圆点”开始运行测试:
3、然后在右边的区域给这几项打钩:
这些选项默认是不选的,但把它们勾选上可以帮你更快定位到关键的代码上,往往这也是问题的源头。
- Separate by Thread:按线程分开做分析,这样更容易揪出那些吃资源的问题线程。特别是对于主线程,它要处理和渲染所有的接口数据,一旦受到阻塞,程序必然卡顿或停止响应。
- Invert Call Tree:反向输出调用树。把调用层级最深的方法显示在最上面,更容易找到最耗时的操作。
- Hide System Libraries:隐藏系统库文件。过滤掉各种系统调用,只显示自己的代码调用。
- Flattern Recursion:拼合递归。将同一递归函数产生的多条堆栈(因为递归函数会调用自己)合并为一条。
- Top Functions:找到最耗时的函数或方法。
4、现在可以查看到代码里面的方法名了,最后双击方法名进行定位!:
5、这就是定位到相应的代码了:
首先从最底层上说,当两个对象相互建立了强引用(strong reference),当一个对象被释放,另一个对象由于是强引用的关系不允许被释放,此时 ARC 无法确定没被释放的对象到底还有没有用,于是就导致了内存泄漏。
要解决这个问题,可以将其中的一个对象中变量设为 weak,不让它出现在保留周期中。很多开发者在管理 view controller 时常会在内存泄漏上中招,以为换了新的controller,老的 controller 就被释放回收了,其实还没。这样代码一多,就会造成很多对象都没被释放。所以用这个工具把整个应用跑一遍,把那些断链的强引用清理干净,会大有裨益。
除了上述这三类工具,Instruments 还有很多实用的工具,推荐大家根据自己的关注点,花些时间去学学。比如:
- Core Data:监测读取、缓存未命中、保存等操作,能直观显示是否保存次数远超实际需要。
- Cocoa Layout:观察约束变化,找出布局代码的问题所在。
- Network:跟踪 TCP / IP和 UDP / IP 连接。
- Automations:创建和编辑测试脚本来自动化 iOS 应用的用户界面测试。
最后小总结下。我倒不想一味夸大 Instruments 的作用,如果应用跑得挺痛快,没出现啥调皮行为,大可把它忽略,等到问题来了再做优化。对于新手来说,花些时间了解 Instruments 的功能,多调试多积累经验,这样做出来的应用在用户体验上肯定错不了。
Instruments检测解决内存泄露以及进行性能测试的更多相关文章
- 使用Xcode Instruments Leak解决内存泄漏问题
iOS 5.0之后apple引入了Xcode编译器特性ARC(Automatic Reference Counting,自动引用计数)来帮助开发者管理内存,但为了追求app的高性能与减少安装包大小,工 ...
- 使用Xcode7的Instruments检测解决iOS内存泄露
文/笨笨的糯糯(简书作者)原文链接:http://www.jianshu.com/p/0837331875f0著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 作为一名iOS开发攻城狮, ...
- 使用Xcode8的Instruments检测解决iOS内存泄露(leak)
在苹果没有出ARC(自动内存管理机制)时,我们几乎有一半的开发时间都耗费在这么管理内存上.后来苹果很人性的出了ARC,虽然在很大程度上,帮助我们开发者节省了精力和时间.但是我们在开发过程中,由于种种原 ...
- (转载--修改)使用Xcode9的Instruments检测解决iOS内存泄露
作为一名iOS开发攻城狮,在苹果没有出ARC(自动内存管理机制)时,我们几乎有一半的开发时间都耗费在这么管理内存上.后来苹果很人性的出了ARC,虽然在很大程度上,帮助我们开发者节省了精力和时间.但是我 ...
- 使用MLeaksFinder检测项目内存泄露总结
前几天看到开源工具MLeaksFinder,决定用在公司的项目中试一下,效果很不错,用法也很简单,直接把项目文件夹拖到项目中就可以了,依靠这个项目,我发现公司项目中有不少内存泄露的地方,在此总结一下: ...
- Android开发过程中使用弱引用解决内存泄露的习惯
Java虽然有垃圾回收,但是仍然存在内存泄露,比如静态变量.缓存或其他长生命周期的对象引用了其他对象,这些被引用的对象就会长期不能被GC释放,导致内存泄露. 弱引用(WeakReference)是解决 ...
- troubleshoot之:使用JFR解决内存泄露
目录 简介 一个内存泄露的例子 使用JFR和JMC来分析内存泄露 OldObjectSample 总结 简介 虽然java有自动化的GC,但是还会有内存泄露的情况.当然java中的内存泄露跟C++中的 ...
- WPF WPF中解决内存泄露的几点提示与解决方法
http://www.cnblogs.com/LastPropose/archive/2011/08/01/2124359.html 一直以来用WPF做一个项目,但是开发中途发现内存开销太大,用ANT ...
- 检测 C++ 内存泄露
转载:http://www.cnblogs.com/zouzf/p/4152279.html #include "stdafx.h" #include <string> ...
随机推荐
- Sybase:delete与truncate、drop区别
Sybase:delete与truncate.drop区别 区别: TRUNCATE TABLE TABLENAME:删除内容.释放空间但不删除定义. DELETE FROM TABLENAME:删除 ...
- 大牛是怎么思考设计MySQL优化方案的?
在进行MySQL的优化之前,必须要了解的就是MySQL的查询过程,很多查询优化工作实际上就是遵循一些原则,让MySQL的优化器能够按照预想的合理方式运行而已. 图-MySQL查询过程 一.优化的哲学 ...
- SpringBoot 密码MD5加密
public class PasswordEncrypt { public static String encodeByMd5(String string) throws NoSuchAlgorith ...
- java中线程状态-死亡
线程死亡: 线程会以如下3种方式结束,结束后就处于死亡状态. 1.run()或call()方法执行完成,线程正常结束. 2.线程抛出一个未捕获的Exception或Error 3.直接调用该线程的st ...
- 并发-CountDownLatch、CyclicBarrier和Semaphore
CountDownLatch.CyclicBarrier和Semaphore 参考: http://www.cnblogs.com/dolphin0520/p/3920397.html https:/ ...
- JavaWeb -- Struts2 ResultType细化, 国际化
1. ResultType细化 <result-types> <result-type name="chain" class="com.opensymp ...
- BOOST学习笔记
BOOST学习笔记 1 tool #pragma once #include <vector> #include "boost/noncopyable.hpp" #in ...
- chrome关闭后还在进程中运行
1.网上搜到信息: 设置 “即使关闭浏览器也后台运行” 取消打勾 2.然后我找了一下,应该是这个选项:“关闭 Google Chrome 后继续运行后台应用” 3. 4. 5.
- css类名大全以及其他关键词
标签 abbr 缩写的标记 token-based-auth-backend 后端 token-based-auth-frontend 前端 signin 登陆 Sign in / Sign u ...
- jQuery EasyUI Datagrid VirtualScrollView视图简单分析
大家都知道EasyUI的Datagrid组件在加载大数据量时的优势并不是很明显,相对于其他一些框架,如果数据量达到几千,便会比较慢,特别是在IE下面.针对这种情况,我们首要做的是要相办法优化datag ...