iOS内存分析之Memory Graph

1.Memory Graph是什么

Memory Graph是在Xcode8上推出的一个新特性。用来生成应用程序中对象分配的内存图。

2.Memory Graph用来做什么

  • Memory Graph可以帮助我们找到循环引用和内存泄漏,正在使用的内存以及每个区域的大小。
  • Memory Graph显示应用程序使用的内存的位置,以及这些使用内存之间的引用关系。

3.如何使用Memory Graph

打开配置

注意点:

  1. 启用Malloc Stack后,Memory Graph会显示分配该节点时记录的堆栈跟踪。使用此信息将Memory Graph中的内存分配与源代码中的函数和方法相关联。如果没有勾选 Malloc Stack 在调试的时候,在右侧是看不到调用的堆栈信息。

  2. 勾选 Malloc Stack 之后内存会相应的增高,如果不调试可以关闭该选项。

  3. 建议选择 Live Allocations Only 如果选择 All Allocations and Free History 会出现一些额外的影响因素。

打开方式

通过单击Xcode工作区底部调试区域中的 Debug Memory Graph 按钮来生成应用程序中对象和分配的内存图。

点击`Debug Memory Graph`暂停应用执行,展示如下:
  • 在左侧debug navigator展示了app的heap contents
  • 在中间部分是对象的引用关系。
  • 在最右侧是展示了当前对象的调用栈回溯。

Memory Graph显示应用程序正在使用的内存区域以及每个区域的大小。图中的节点代表一个对象(object)、一个堆分配(heap allocation)或内存映射文件(memory-mapped file)。节点之间的连接,通过箭头连接,显示一个内存区域引用另一个对象。

Tips:

为了帮助我们更快的分析内存泄漏,我们可以在左侧的debug navigator进行筛选只展示leaks的内容。

可以将我们生成的memory graph进行导出,选择 file > export Memory Graph 共享给团队内的人员使用和分析探索。我们还可以使用命令行工具进行分析,主要的指令有leaksheapvmmapmalloc_history等。

4.项目实际应用及分析

导出所对应的Memory Graph使用命令行的形式进行分析。主要分析内存泄漏大内存占用。

Memory FootPrint


Apple推荐我们使用FootPrint命令查看一个进程占用的大小。关于什么是 footprint,在官方文档 Minimizing your app’s Memory Footprint 里有说明:

FootPrint =  Dirty memory + Swapped memory(Compressed memory)
Refers to the total current amount of system memory that is allocated to your app.

iOS中内存分为两种:

  • Clean memory

    • 内存映射文件(Memory mapped files )
    • 数据段常量/代码段数据 (System Frameworks)
  • Dirty memory

    • (堆上分配的内存) All heap allocations

    • (解码图像缓冲区) Decoded image buffers

    • Frameworks

      Clean memory在系统内存紧张的时候可以从page中换出,当再次访问的时候可以从磁盘中进行读取。Dirty memory是无法换出的

在iOS7时Apple引入了Compressed memory ,即系统可以把最近最少使用的Dirty memory进行压缩,这样可以腾出一些pages供使用,当再次需要访问内容时,系统将其解压,这时,原来内容占多少pages,解压后同样会是相同数量的pages

1.内存分析

先通过vmmap看一下内存的摘要图:

    vmmap -summary memGraph.memgraph
  • 从这个图中可以看到当前app的一个内存分布情况,footPrint占用的内存大小为26.1M,根据footprint的计算方式可以知道,我们需要关注的是dirty size + swapped size这两列的数据。首先看下对应的Region type分别代表的是什么内存。

    • CG raster data(光栅化数据,也就是像素数据。注意不一定是图片,一块显示缓存里也可能是文字或者其他内容。通常每像素消耗 4 个字节)
    • Image IOIOSurface(图片编解码缓存)
    • maclloc_ 开头的是我们自己通过malloc进行创建的内存占用。这部分内存在所谓的Heap上。
    • IOSurface 在CoreGraphics、OpenGLES、Metal之间传递纹理数据。简单理解为IOSurface,为CPU和GPU直接搭建了⼀个传递纹理数据的桥梁。

那么看下具体的是哪些类占用了内存。需要具体来分析一下。

从里面看到都是CG raster data 占用比较大。具体在哪里被引用了,需要看一下具体的调用栈。首先筛选出来CG raster data的内存信息,包括它的地址、尺寸以及所在Heap Zone等等信息。我们可以在这里找到我们的目标。

vmmap memGraph.memgraph |  grep 'CG raster data'

malloc_history -fullStacks memGraph.memgraph 0x10ee24000

通过vmmap 筛除所有关于CG raster data内存情况。然后通过malloc_history -fullStacks拿到对象的详细调用堆栈。

可以看出是在SDWebImage对图片的解码数据做了缓存。建议在使用的时候设置缓存的图片数量和大小。也可以根据具体的情况关掉解码的缓存。或者在加载大图的时候使用ImageIO的形式进行加载。

2.内存泄漏

通过leaks筛除所有的内存泄漏

leaks memGraph.memgraph

从上图中可以看出,是AFHttpSessionManager出现了内存泄漏,从引用的关系中可以看出,是当前的sessionManager强引用了sessionsessiondelegate同时强引用了sessionManager。解决方案就是我们在调用之前使用weak弱引用sessionManager,当请求完成的时候执行finishTasksAndInvalidate

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

推荐阅读更多精彩内容