iOS小结(五) 结合 Instrument 分析并解决memory issues

本文介绍了如何使用Apple的Instrument工具分析和解决iOS应用的内存问题,包括内存持续上涨和内存泄漏。通过Instrument的Allocation、Leak和Time Profile等功能,可以定位问题并进行优化。文中详细阐述了如何启动和解读Instrument的分析结果,特别是如何利用Call Trees来追踪内存分配的函数调用路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


       memory通常遇到两种问题:

  •  memory 持续上涨
  •  memory leak
         memory leak我遇到过一个问题是因为几个小的变量因为new的没有delete。

        遇到这些问题,首先是要分析是什么原因导致 memory 上涨, 涨的又是什么?

        分析利器:Instrument

        对于profile, 之前知道CUDA有自己profile的可视化工具, 而 apple 的 Instrument 是分析 ios 和 mac 程序运行时间和 memory allocation 很有效的工具。

iOS没有自动垃圾回收

       iOS没有自动垃圾回收,只有Mac OS X有自动垃圾回收的选项,在build settings 里, Objective-C Garbage Collection。
       垃圾回收发生在程序运行时,当系统检测到内存不足时,开始清理。这是一个计算密集的过程,系统追踪所有的对象和引用,检测对象是否被正确引用,所以很容易引起程序中断。所以并不推荐使用自动垃圾回收。
       iOS没有垃圾回收,大家说的ARC是什么?是Automatic Preference Counting 的缩写, 自动引用计数。为了方便程序员,在Xcode4.2以后引入了ARC。
       当不使用ARC时,我们要手工管理内存计数:
       对象刚创建时,引用计数初始为1, 
       为保证对象存在,每次给对象创建引用,引用数加1,可以给对象发送retain消息:
[myFraction retain];
       不再需要该对象时,引用数减1,给对象发送release消息:
[myFraction release];
       当对象引用计数为0时,系统就知道不再需要使用了,可以释放其内存,通过给对象发送dealloc消息进行。如果这时有其他变量要释放,需要覆写改类的dealloc方法,否则就使用继承自NSObject的dealloc方法。

how to use instrument

        Instrument 有两种打开方式,一种是直接打开录制,另一种是在 xcode 里 debug 过程中跳转,或直接在 xcode 界面中看大概的 memory 和 cpu 占用。

        对于第一种,直接在Spotlight里搜Instrument,可以看到Instrument可以分析的东西有很多,其中我们最常用的就是 Allocation, Leak 和 time profile了。Allocation 是分析memory 最准的, Leak 可以看哪里有内存泄漏,而且能看到函数调用关系, time profile 就是看CPU 各进程运行时间了,可以看具体是哪个进程是瓶颈,进而优化程序运行速度。另外GPU Driver如果用了GPU,应该也是很有用的。


       下面以Allocation为例,解释如何分析memory issue。 好,点击Allocation 出现了下面的界面:


             可以用 Instrument 记录下来你的操作过程中内存的分配,从空间和时间两个维度,录制的结果也可以保存成.trace文件,也是用 Instrument 打开。 首先在红框1处选择要监控的硬件对应的程序,点击红框2处的红点开始录制, 这里录制的程序应该是已经下到手机上的,而不是正在debug。开始执行操作吧,哪里有问题就哪里再想办法再现该操作,记得用单一变量法来缩小范围。

             录制完毕,怎样分析呢,可以在上半部分的面板拖拽一个范围,也就是监控这段操作过程中,相对增长的内存空间。而有用的数据主要是看 Statistics 和 Call Trees,在上图中用红圈3标识,call trees 是这部分占用的内存的函数调用关系,可以帮助很有用的找到问题的来源,有向右箭头的地方可以展开,有时函数调用的很深,借助方向键很方便。

             我这里打开了一个我保存的一个allocation.trace, 通过statistics,就可以看到在这个过程中LoadModel没有释放,再看call Tree,两者结合就能定位。



            上面所说的第二种打开方式,是在debug中,程序已经下到手机上之后,点击下图左边这个pool一样的红圈圈出来的图标,就可以看到 CPU 和 memory 都有实时监控,只不过 debug模式可能不是很准,点击右侧界面的Profile in Instrument,就打开了Instrument,memory的监控是跳到 Leak 而不是 Allocation, 写好的程序应该时常有意识测一测,有没有leak, Leak这个入口也可以看allocation, 不过不是完全从程序一开始就监控,基准线低一点。


            leak 和 time profile用法类似,time profile测时间,可以比较主进程和其他进程主要是哪个进程里什么操作是瓶颈,进而优化程序。

how to fix

            分析到问题所在,一般来说要具体问题具体分析,有的时候是该释放的没有及时释放,更多的时候是想要释放的时候已经lose track了,拿不到那个指针。
            IBM开发者论坛上有一篇帖子写的很全面,可以学习一下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值