使用Memory Leak进行内存泄漏查找

备注:这是三年前还在做游戏项目时分享的一篇文章,虽然已经过去三年,但其中所涉及的方法却一直都在使用,因此再贴出来,希望能帮到一部分程序工程师朋友。

在项目的整个开发过程中一直伴随着手机客户端的内存问题,时不时的也会出现一些内存导致的Crash情况,出现Crash的原因可能会有很多,但在IOS设备上很多常常是由于内存吃紧导致的,如果出现内存不够用而Crash的一个直观表现是在Iphone 6 plus设备上更容易重现,这是由于6P的内存只有1G,但由于该设备屏幕更大而需要更多的Frame buffer空间,因此在该IOS 设备的内存最为吃紧。

很多内存问题在PC的开发阶段就可以暴露出现,这种情况比较容易处理,毕竟PC上工具链很丰富,本文要探讨的问题是在IOS设备上导致的一些问题,本文也介绍工具是Xcode的Instruments提供的Memory Leaks工具,如图,由下图中可以看出Instruments提供了很多工具可供开发使用,其它工具慢慢摸索。

image

如何启动Leaks工具,参考官方文档[自行搜索吧,头条不允许放外链]

发现问题:

在Xcode中启动游戏后,使用内存监控工具查看内存的变化情况,发现当场景Load完成后一段时间内内存是稳定的,然后过段时间内存突然涨了赶来,如下图所示。出现这个问题第一个反应是去检查了一下代码逻辑,打出了一些Log后也没有发现有哪里会突然需要分配这么多的内存,纠结了一会之后突然想来Xcode提供的Memory Profile工具,于是乎有了后面的内容。

image

选择游戏项目,使用Leaks工具启动Record功能,在游戏内跑一下游戏,得到了如下的内存使用时间序列图,首先从图中可以看出Neox引擎在启动游戏不久之后就出现了内存泄漏(图中红色的叉),占进去看一下吧^^,所幸这些Leaks并非是导致内存暴涨的原因。

image
image

粗略看了一上内存泄漏的部分,可以看出这些漏泄并不是本次关心的重点,重点是最内存使用图中最后一次的增长,那么这一时间段内到底是什么占用了内存呢?所幸Instruments给我们提供了查看某一时间段内内存分配的功能,好了,现在就我们把锁定到第40s左右来看看。

image

如图中蓝色部分,时间 大概是39s-42s之间,这段时间内内存增加了大约70M, Allocation Summary部分给出了这段时间内内存的分配情况。从图中我们可以看到有一个68M的内存分配,那么这些内存是分配给谁了呢?带着这个问题,我们一层一层的点进去看看究竟吧。

image

进去之后,我们对分配内存的操作进行排下序,会发现有10次的内存分配操作,每次分配了6.6M的内存。也即是说这段时间内NXMemoryFile分配了66M的内存。还好在这一步我们还可以继续往下深入分析,最终定位到分配内存的那段代码:

image

至此,可以说是找到了内存暴涨的主要原因的线索,由于NXMemoryFile是一个基础的模块,其实我们还没有找到究竟是谁调用了这段代码,其实到了这一步问题就变得很简单了,加个断点,根据call stack来查找问题源头。ps, 由于Xcode出了点问题,执行断点时加载不出来了调用栈,这里面就不贴图了,栈的源头是_audio.cpp模块加载fsb文件。为什么fsb文件的加载会导致内存的暴涨呢?

FMOD模块在加载fsb时,以流的方式读取解压文件,所以播放FSB格式的音频文件理论上来说不会导致太多的内存增长,而问题是我们将fsb文件打入了NPK文件内部,因为Fmod模块没有办法直接使用流的方式读取npk文件,因此为了能够加载npk内的fsb文件,neox里面有一个基于内存的文件系统NXMemoryFile,先将文件读取到内存中,然后fmod才能以文件的形式加载fsb数据,因此也就导致了内存的暴涨。

另外(由于没看Fmod代码,这是根据程序运行时的表现猜测的)Fmod在读fsb时应该是open一个文件,然后持有一个handler,而每一个handler对应一个内存文件,这也就导致了同一份fsb文件在内存中会有多个内存文件。

既然定位到问题是由于将FSB文件打入npk导致的,那么就尝试将fsb文件从npk文件中分离出来,下图是不再将fsb打入npk的客户端的运行情况,内存的使用情况较先前有了很大的好转,同时在不同设备上运行一段时间之后,crash的情况也确实变得很少了。

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

推荐阅读更多精彩内容