iOS Instrument Allocations
iOS Instrument Allocations
Lambda8421 发表于3年前
iOS Instrument Allocations
  • 发表于 3年前
  • 阅读 70
  • 收藏 0
  • 点赞 0
  • 评论 0

注:参考apple官网Instruments User Guide   https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40004652-CH1-SW1

        参考apple官网Instruments Help Articles https://developer.apple.com/library/ios/recipes/Instruments_help_articles/FindingAbandonedMemory/FindingAbandonedMemory.html#//apple_ref/doc/uid/TP40012965-CH34-SW1

编译和分析工具Analyze

    iOS的分析工具可以发现编译中的warning,内存泄漏隐患,甚至还可以检查出logic上的问题;所以在自测阶段一定要解决Analyze发现的问题,可以避免出现严重的bug;

    Analyze是静态分析工具 可以通过菜单 Product→Analyze启动

 

    内存泄漏隐患提示:

    Potential Leak of an object allocated on line ……

    数据赋值隐患提示:

    The left operand of …… is a garbage value;

    对象引用隐患提示:

    Reference-Counted object is used after it is released;

 

    以上提示均比较严重,可能会引起严重问题,需要开发者密切关注!

        下图是一个Demo展示:

        

在App中定位内存问题      

       管理内存是app开发中最重要的一个方面。不管是iOS手机还是mac OS 电脑,内存都是紧缺资源。对于很多开发者来说,在程序架构中减少内存的使用通常都是使用Allocations Instrument去定位和找出减少内存使用的方式,比如可能是改进程序架构和算法。但是,再好的App设计都会被不同的内存问题困扰。这一节就是讲述 怎么样使用工具去识别几个通用的内存问题。

 

用Activity Monitor Trace Template检查内存使用情况

       Activity Monitor Trace Template 综合统计了系统的活动,包括CPU、memory、disk 和 network。但是它仅仅包含了Activity Monitor,你可以在Trace Template 中增加你想增加的工具。比如,后面你将会看到在iOS设备上可以在Activity Monitor 中可以观察网络活动。Activity Monitor 工具捕获加载在系统上的信息和虚拟内存的大小进行比较。它还可以记录系统上一个或者多个程序的信息。它可以提供给你一个方便快捷的表格去观察收集的信息, 下面是memory usage中两个表格的详细描述:

      Real Memory Usage(bar graph):显示使用内存最多的五个

      Real Memory Usage(pie chart): 显示使用内存最多的五个的内存总量

   

       这个记录的设置面板的侧边栏的设置区域中包含了一系列的内存统计,是设置能够通过计算一些数据显示在记录面板中。选择统计选项去查看具体的内容。点击图形或者颜色去设置是否让该项出现在记录面板中。

       

 

        这里有一系列Activity Monitor 工具支持的统计,下面这些是有关内存的描述。

        Physical Memory Wired

        Physical Memory Active

        Physical Memory Inactive

        Physical Memory Used

        Physical Memory Free

        Total VM Size

        VM Page In Bytes

        VM Page Out Bytes

        VM Swap Used

       如果这些选项没有出现在系统统计中,就点击下面的“Select statistics to list”,然后点击这些选项的复选框。

用Allocations Trace Template找出的Abandoned Memory内存

       你可以在App中用Allocations Trace Template找出系统Abandoned Memory(原文Abandoned Memory)。Abandoned Memory和内存泄露不一样。内存泄露是你先前分配的内存但是长时间没有引用去引用它,换句话说,你没有用任何的方式去释放它。Abandoned Memory就是你分配的内存由于一些原因不再使用。也许你的应用程序包含一个你从来没有完全实现功能的一些代码,或者你有一个错误的代码中添加图片缓 存,但它们已经被缓存了。这些内存都会影响App的整体内存占用,你应该解决这些问题使得你的应该程序更加高效。

       因为被Abandoned Memory在技术上依然是有效的,但是不再有用。Leaks Instrument没有办法去识别它们。因此,你必须执行一些检测的工作去定位这些问题。Allocations Trace Template帮助App跟踪堆内存的分配和使用,很详细的描述了每个类的每个对象的内存分配。它也能统计虚拟内存的分配和使用记录。它包含了 Allocations和VM Tracker工具。如果是为了统计Abandoned Memory,就要使用Allocations工具。

       用Allocations Template能保证在重复执行一系列的操作的时候堆内存不会继续增加。例如,结束和开始一个游戏,打开和关闭一个窗口、设置和取消一个引用都是在概念 上相同的操作,这样让你的App保持先前的内存分配状态。通过多次循环这样的操作不会导致堆内存的无限增长。这种重复的分析过程叫做 “generational analysis”。“generation”代表在一段特定时间内的一系列分配。通过对多个“generation”动作的重复操作,你可以分析结果, 观察确定内存分配的趋势。当你发现了不正确的结果或者相矛盾的趋势,你可以研究是不是有Abandoned Memory,然后你就可以改正它。

  1. 打开Allocations trace template

      

     2.在工具条中选择你的目标app

       

    3. 在侧边条中点击显示设置按钮.

       

         这可以让你快速访问生成的标记按钮,使用它来为你的应用标记不同操作显示的信息。

    4. 在工具条中点击纪录按钮去开始记录应用

       

    5. 在App中执行一系列的重复操作

         为了准确地生成的趋势分析,这应该是一组动作的开始和结束在相同的状态。

    6. 在每个重复动作迭代完之后,点击Mark Generation按钮

       

 

        在跟踪面板中生成一个标记去识别一个“generation”。

        标记的一系列“generation”都会在跟踪面板中显示。每个“generation”都有一系列的内存分配表。

    7.重复第五歩和第六步几次,直到你是否观察到内存无限增长。然后点击停止按钮

       

 

       这里 “generation”用作真正的分析。“generation”在你记录开始之后也能被标记。在跟踪面板的时间线上,简单的拖拽运行的时间线到你想要的位置,然后在侧边栏中点击Mark Generation。

    8.在详细的面板的中。点击“generation”左边的disclosure triangle按钮来显示“generation”包含的目标。

        

    9.查找App中仍然存在的分配的目标。选中一个,点击它左边的disclosure triangle按钮来显示它的Instance。

    10.选择其中一个Instance,在右边的侧边栏中点击Extended Detail去观察分配stack trace。

        

          在stack trace中,你的代码是很容易辨认的。因为它是黑色的,前面有一个用户图标。为了使你的代码更容易被找到,单击collapse button 隐藏在stack trace上的系统调用代码。

    11.在stack trace上双击进入代码显示界面

       

        点击Xcode图标进入Xcode界面显示代码。

      

 

    12.评估你的代码确定内存分配是否正确。如果不正确,那说明这个Abandoned Memory你应该解决。

         注意:除了帮助你识别被Abandoned Memory,generational analysis也可以用于定位内存泄露和缓存的内存泄漏。如上所述,泄漏的内存(也可以用Leaks Instrument检测)是应用程序没有引用而且不能释放或再次使用的内存。高速缓存的内存,是用于应用程序再次使用以便获得更好的性能的内存。

      13.instrument 工具跟踪应用的内存分配情况。

      该 instrument 工具要 求你加载一个进程,以便它能收集进程开始之后的数据。 
该 instrument 工具捕获以下信息:

     

      类别(Category)通常是一个 Core Foundation 对象、Objective-C 类、或原始 
内存块(block)。

      净分配字节数(Persistent Bytes):                       当前已经分配内存但是仍然没有被释放的字节的总 
数。

      净分配数(#Persistent):                                      当前已经分配内存但仍然没有被释放的对象或内存块的数量。

      临时分配数(#Transient):                                    当前已经分配内存但仍然没有被释放的对象或内存块的数量。

      总分配字节数(Total Bytes):                                所有已经分配内存,而且包括已经被释放了的 
字节的总数。

      总分配数(#Total):                                               所有当前已经分配内存,包括已经被释放了的对象或内存 
块的总数。

      临时分配/全部内存分配(Transient/Total Bytes):当前和全部分配数的直方图。

      当比例变化时,直方条会变颜色,Instruments 应用通常给它们标示不同的颜色来指出分配模式以便进行进一步的研 究。

      详细面板的数据表格包含了一个图形列,其中包含了表中的每一行的复选框。当 指定类别的复选框被勾选时,instrument 工具在跟踪面板里面显示特定类别的图形。 Instruments 应用通常给每个图形类别赋一个颜色。

      当你鼠标移动到详细面板上面的类别名称上时,会在类别名称的旁边显示一个更 多信息的按钮。单击该按钮会显示关于该类别上的对象的详细信息。

共有 人打赏支持
粉丝 11
博文 120
码字总数 121640
×
Lambda8421
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: