文档章节

iOS Instrument Allocations

Lambda8421
 Lambda8421
发布于 2015/03/05 18:05
字数 2365
阅读 85
收藏 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 应用通常给每个图形类别赋一个颜色。

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

© 著作权归作者所有

共有 人打赏支持
Lambda8421
粉丝 10
博文 121
码字总数 121640
作品 0
闸北
程序员
开源手机自动化测试框架iQuery入门教程(一)

上次介绍iQuery之后,已经有些朋友在开始在手机自动化测试程序里试用iQuery了,由于之前的介绍文档比较含糊,先搁置扩展iQuery使其支持多种编程语言的系列文章,补充一下iQuery的入门教程,之...

知平软件
2012/09/12
0
0
iOS Instruments Time Profiler

Time Profiler 有两种方式可以打开Time Profiler。我们先来介绍第一种: 一、从Debug界面打开Time Profiler 1)首先打开Xcode,在编译成功后运行App,这里测试Demo是选择在游伴项目中直接添加...

Lambda8421
2015/03/11
0
0
iOS11 instrument和真机测试的新玩法--无线调试模式(connect via network)

1.真机调试问题 做iOS开发的同学们都晓得instrument这个开发者工具的神奇之处,好处自然不会多说,下面就说说iOS11 中instrument真机测试时的新玩法.想必做过重力感应,蓝牙,无线连接,地图定位的...

贝勒老爷
08/10
0
0
10个优秀Objective-C和iOS开发在线视频教程

如果你自己开发iOS应用,你肯定会发现网上有很多资源。学习编程的一个最好的方法就是自己写代码,而开始写代码的最快的方式就是看其他人怎么写。我们从海量视频和学习网站中整理出了我们认为...

mingxun
2014/05/09
0
0
学习如何针对iOS 7进行开发?

  iOS 7已经发布了六个测试版,除了beta 6进行了小幅修正外,其他几个测试版都有不小的改动。昨天有消息说苹果将在9月10日发布iOS 7正式版,那么GM版很快将会与开发者见面。在iOS 7来临前夕...

fangzhou99
2013/09/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

spring-boot | 日志

引言 好久不见,都还好吗? 大家都知道,我一般都是带来实用的东西,这次也一样,我们来试试项目开发中的日志处理。 理论知识 1、为什么要用日志?你是否因为项目出现问题,查找日志文件定位...

成都_小冯同学
5分钟前
0
0
dubbo下的补偿实现(一)

背景 由于前面几篇文章涉及的问题 分布式事务的思考 在我们微服务的场景下 各种本地事务都没有办法控制的很好。 A服务调用B服务 当B服务成功提交之后 A发生了异常 这种情况下要如何处理呢??...

Mr_Qi
14分钟前
0
0
HTML显示json字符串并且进行格式化

通过pre标签进行格式化展示,使用JSON.stringify()方法转换。 代码如下:   <html> <head> <title>HTML显示json字符串并且进行格式化</title> </head> <body> <p id="show_p">{ "name": "B......

writeademo
35分钟前
0
0
LNMP——php-fpm

php-fpm的pool •vim /usr/local/php/etc/php-fpm.conf //在[global]部分增加include并删除我们之前www池子 • include = etc/php-fpm.d/*.conf • mkdir /usr/local/php/etc/php-fpm.d/ • ......

chencheng-linux
38分钟前
0
0
TensorFlow layers slim 模块搭建cnn对mnist分类,比较bn效果

shape变化 (?, 784)(?, 28, 28, 1)(?, 14, 14, 8)(?, 7, 7, 8)(?, 1, 1, 8)(?, 8)(?, 10) 结果对比,基本上还是有点用的 0.91725457 0.9232 0.9548 0.95530.9177273 0.9234 0....

阿豪boy
41分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部