文档章节

iOS Instrument Allocations

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

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

© 著作权归作者所有

共有 人打赏支持
Lambda8421
粉丝 10
博文 120
码字总数 121640
作品 0
闸北
程序员
IOS12开发者预览版第二版使用评测

     手头有一部iPhone 6s Plus,因为之前看同学和朋友们升到IOS 11后手机变得非常卡顿所以没有升级。最近偶然看到IOS 12针对旧机型做了性能优化,号称提升70%相机打开速度、50%键盘显示...

张旭乾 ⋅ 昨天 ⋅ 0

【AR】开始使用Vuforia开发iOS(2)

原 设置iOS开发环境 安装Vuforia iOS SDK 如何安装Vuforia iOS示例 编译并运行Vuforia iOS示例 支持iOS金属 iOS 64位迁移 设置iOS开发环境 适用于iOS的Vuforia引擎目前支持运行iOS 9及更高版...

lichong951 ⋅ 06/11 ⋅ 0

HDU ~ 6297 ~ CCPC直播 (模拟,输出格式控制)

思路:模拟就行了,注意Running和RTE的开头字母一样。 iomanip是I/O流控制头文件,就像printf的格式化输出一样。 以下是一些常用的: dec 置基数为10 相当于"%d" hex 置基数为16 相当于"%X" oc...

zscdst ⋅ 05/29 ⋅ 0

苹果对体无完肤的 iOS 11 最后的弥补

点击上方“CSDN”,选择“置顶公众号” 关键时刻,第一时间送达! 距离万众瞩目的苹果开发者大会(WWDC 2018)的召开还有不到一周时间,苹果公司于今天凌晨,正式发布了 iOS 11 的第十四次更...

csdnnews ⋅ 05/30 ⋅ 0

天生不凡ios怎么在电脑上玩 天生不凡ios电脑版玩法教程

天生不凡ios怎么在电脑上玩呢?现在有很多小伙伴都在玩天生不凡手游,不过相对于传统的在手机上进行游戏,很多人都倾向于新玩法,就是在电脑上玩天生不凡手游。下面小编就给亲们介绍下天生不...

kaopu8520 ⋅ 05/29 ⋅ 0

Dhar/YTTInjectedContentKit

YTTInjectedContentKit iOS壳版本场景下的批量修改类名、属性名、插入混淆代码、修改项目名称的shell脚本 具体的实现和使用方法请参考我的博客文章: iOS使用shell脚本注入混淆内容 iOS使用S...

Dhar ⋅ 05/04 ⋅ 0

苹果 WWDC 2018 重点推出 iOS 12

苹果正式宣布第 29 届年度全球开发者大会(WWDC 2018)将于美国当地时间 6 月 4 日星期一(北京时间 6 月 5 日凌晨一点)拉开帷幕,大会将持续到 6 月 8 日星期五。和 2017 年一样,此次会议...

问题终结者 ⋅ 04/15 ⋅ 0

又拍云Prism CDN 超低价 低延时 超强兼容的P2P-CDN

又拍云Prism CDN 超低价 低延时 超强兼容的P2P-CDN 2018-05-15 10:26编辑: 枣泥布丁分类:业界动态来源:https://www.upyun.com/products CDN又拍云 招聘信息: C++工程师 Cocos2d-x游戏客户...

枣泥布丁 ⋅ 05/15 ⋅ 0

面试官自述:面向高级开发人员的iOS面试问题

当您准备进行技术性iOS面试时,了解您可能会询问哪些主题以及经验丰富的iOS开发人员期望什么是非常重要的。 这是许多硅谷公司用来衡量iOS候选人资历水平的一系列问题。 这些问题涉及iOS开发的...

菇哒微课 ⋅ 04/26 ⋅ 0

如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊 ⋅ 05/26 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

如何使用serverchan微信推送告警

之前实现推送告警信息到微信的方法有如下几种: 1、通过企业公众号实现----收费: 2、通过QQ邮箱,在微信平台上开启收到邮件进行提醒; 3、第三方告警平台API,一般也是收费的; 不过最近看文...

问题终结者 ⋅ 14分钟前 ⋅ 0

TCP的RPC

RPC就是远程方法调用(Remote Process Call ),包含了客户端和服务端,涉及了对象的序列化传输。 1.服务端启动,注册远程调用的类2.客户端发送请求信息包含类、方法、参数的一些信息、序列化传...

Cobbage ⋅ 34分钟前 ⋅ 0

IOS-UI UI初步代码布局添加事件

ISO开发界面,UI是必须学习的一部分,其实很早之前想学来了,一直没有沉下心来学习。看到IOS的代码风格和布局就别扭的不行,跟java代码和android布局比较显得不是那么方便,所以一直到现在。...

京一 ⋅ 44分钟前 ⋅ 0

浅谈OpenDaylight的二次开发

OpenDaylight作为一款开源SDN网络控制器,依托于强大的社区支持以及功能特性,成为了目前主流的SDN网络控制器开发平台。在比较稳定的OpenDaylight Helium版本中,已经为开发者提供了大量的网...

wangxuwei ⋅ 54分钟前 ⋅ 0

API 开发中可选择传递 token 接口遇到的一个坑

在做 API 开发时,不可避免会涉及到登录验证,我使用的是jwt-auth 在登录中会经常遇到一个token过期的问题,在config/jwt.php默认设置中,这个过期时间是一个小时,不过为了安全也可以设置更...

等月人 ⋅ 54分钟前 ⋅ 0

Java NIO之文件处理

程序要操作本地操作系统的一个文件,可以分为以下三个部分: 对文件位置的操作 对文件的操作 对文件内容的操作 其中,对文件内容的操作在 Java NIO之Channel 中已经有了介绍,通过FileChann...

士别三日 ⋅ 59分钟前 ⋅ 0

Maven的pom.xml配置文件详解

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.......

小海bug ⋅ 今天 ⋅ 0

解决httpclient超时设置不生效的问题

最近公司有项目需要通过http调用第三方服务,且第三方服务偶有超时,故需要设置一定的超时时间防止不响应的情况出现。 初始设置如下: [java] view plain copy //超时设置 RequestConfig re...

Mr_Tea伯奕 ⋅ 今天 ⋅ 0

过滤器Filter和拦截器HandlerInterceptor

过滤器 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要...

hutaishi ⋅ 今天 ⋅ 0

Redis入门详解(转)

Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis应用场景 Redis总结 Redis简介: Redi...

xiaoyaoyoufang ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部