zoukankan      html  css  js  c++  java
  • 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 的功能,多调试多积累经验,这样做出来的应用在用户体验上肯定错不了。

  • 相关阅读:
    java JSONObject
    android 8.0 悬浮窗 最简demo
    使用adb 命令(atrace)抓起systrace的方法。
    使用python处理selenium中的获取元素属性
    使用adb/Linux获取网关ip
    Requests text乱码
    python-uiautomator2
    adb命令 判断锁屏
    缓存穿透、缓存击穿与缓存雪崩
    ReentrantLock重入锁详解
  • 原文地址:https://www.cnblogs.com/pengyunjing/p/5901031.html
Copyright © 2011-2022 走看看