iOS 底层原理39:Instruments系列(二)Allocation

iOS 底层原理 文章汇总

Allocation 概述

Allocation主要用于App检测内存分配和使用情况等,统计到的内存类型All Heap & Anonymous VM(堆内存 和 虚拟内存)、All Heap Allocations(堆内存)、All Anonymous VM(虚拟内存),其中Anonymous VM(虚拟内存)是我们无法控制的部分,所以一般只关注All Heap Allocations(堆内存)

在Allocation主要包含4类统计项:


统计项
  • Statistics
  • Call Trees
  • Allocations List
  • Generations

在Allocation最下方有两个筛选选项,分别是:


筛选选项
  • Allocation Lifespan:筛选需要记录的Allocation,一般我们只勾选Created & Persistent

    • All Allocations:所有的

    • Created & Persistent:创建且存活的

    • Created & Destroyed:创建且被销毁的

  • Allocation Type:记录Allocation的类型,一般关注All Heap Allocations较多

    • All Heap & Anonymous VM:所有真实内存和虚拟内存

    • All Heap Allocations:所有真实内存

    • All VM Regions:所有分配过的虚拟内存

Statistics 统计项

主要包含6个统计字段,分别对应的含义如下


Statistics 统计项-字段
  • Category:对象类型,包含Core Foundation对象、OC类、内存块

  • Persistent:当前活跃的内存总量

  • #Persistent:当前活跃的内存数量

  • #Transient:已经释放的内存申请数

  • Total Bytes:总字节数

  • #Total:申请内存总次数

Call Trees 统计项

这个功能是将列表展示类型切换成调用树的形式,如下所示,有3个统计项:


Call Trees 统计项
  • Bytes Used:相应方法使用的内存量

  • Count:方法被调用的次数

  • Symbol Name:方法名称

对应的在Call Trees下方还有三个配置项,下面分别来介绍

  • 【调用过滤】Call Tree:配置调用树的显示,一般勾选1、3、4、5

    调用过滤

    • 1、Separate by Category:按类别隔开,☑️后,可以更方便的看出是哪些类别的VM


      Separate by Category
    • 2、Separate by Thread:按线程划分


      Separate by Thread
    • 3、Invert Call Tree:反转调用,通俗来说就是从上倒下跟踪堆栈,例如FuncA{FunB{FunC}} 勾选此项后堆栈以C->B-A 把调用层级最深的C显示在最外面

      • 勾选前


        Invert Call Tree-选前
      • 勾选后


        Invert Call Tree-选后
    • 4、Hide System Libraries:隐藏系统方法,因为目前我们只关心自定义的方法,这个是必选的

      Hide System Libraries

    • 5、Flatten Recursion:递归函数,每个堆栈跟踪一个条目

      Flatten Recursion

  • 【数据过滤】Call Tree Constraints:主要是对列表中的数据进行过滤,可以设置最大/最小的数量和字节数

    数据过滤

    • 配置前的列表


      配置前
    • 配置后的列表,例如配置只显示count为500以内的


      配置后
  • 【库/符号过滤】Data Mining:数据挖掘,简单来说就是可以过滤掉不看的库、符号调用,点击Symbol、Library会自动把你选中的行的符号、库加到小框中。例如选中start,点击symbol,就自动过滤了start相关列

    库/符号过滤

    其中Symbol(符号)Library(库)有两个选项,即是否过滤改行,如果点击Restore会去掉小框中的选中行
    选项

Allocations List 统计项

Allocations List 统计项
  • Adress:内存块的地址

  • Category:对象的类型

  • Timestamp:申请内存的时间

  • Size:内存块的大小

  • Responsible Library:负责申请该内存的库

  • Responsible Caller:负责申请该内存的方法

Generations 统计项

在Allocation中,可以通过对每个动作的前后进行Mark Generation,用来对比内存的增加,可以定位到内存增加的具体方法和代码所在位置。其中有4列统计项


Generations 统计项
  • Snapshot:快照名

  • Timestamp:快照时间

  • Heap Growth:自上次快照以来的增长数量

  • #Persistent:依旧存活的对象数量

这个功能非常有用,通常用在:进入一个页面前mark一下,在退出这个页面的时候再mark一下可以比较哪些内容增加了,就可以具体分析哪些内存没有被释放。具体操作如下所示

  • 运行程序,点击底部Mark Generation,这样就生成一个Generation


    Generation
  • 当跳转到其他页面时,再生成一个Generation

  • 然后查看生成的Generation的Growth的大小

    Growth

  • 如果Growth太大,可以点进去查看占用较大线程中的代码块,点击Generation的箭头,进入具体的线程

    具体的线程

使用

  • Xcode菜单 - Product - Profile - Allocation,并选择真机,对应项目,运行


    路径

从截图中可以看出Heap为1.17MB,VM是1.16MB,在程序有需要时能提供足够的内存空间,并不是现在创建的。因此手机分配给App的内存是2.32MB。

  • 一般选择Generation,分析不同页面的内存情况,需要多个mark generation,然后选择一个Generation,进入详情分析页面,


    详情分析页面

    主要关注堆内存,所以按内存分类,并隐藏系统函数


    内存分类

    从最上面可以看到堆内存+虚拟内存总共占了1.9MB,堆内存占了约1M,点开箭头查看具体的函数,然后点进去就可以看到内存激增的代码了,然后可以进行相应优化(由于是demo,所以不贴具体的代码图示了)
    具体代码

参考文章

Instruments学习之Allocations
iOS性能分析-Xcode Instruments Allocations 分析APP内存使用情况
使用instrument-->Allocations进行内存分析

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,695评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,569评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,130评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,648评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,655评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,268评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,835评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,740评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,286评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,375评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,505评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,873评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,357评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,466评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,921评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,515评论 2 359

推荐阅读更多精彩内容