App运行过程中,如果内存占用过高会引起以下问题。
1.被系统的守护进程杀掉,无论是在前台还是后台;
2.耗电增大,手机发热;
3.系统可能会运行卡顿;
所以在手机内存有限的情况下,最大限度的保证程序运行流畅和尽可能的优化使用,有必要做内存优化。
一、优化之前先了解相关概念
->了解参考
-
Clean Memory
Clean Memory 是指那些可以用以 Page Out 的内存,包括已被加载到内存中的文件,或者是 App 所用到的 frameworks。每个 frameworks 都有 _DATA_CONST 段,当 App 在运行时使用到了某个 framework,它所对应的 _DATA_CONST 的内存就会由 Clean 变为 Dirty。 -
Dirty Memory
Dirty Memory 是指那些被 App 写入过数据的内存,包括所有堆区的对象、图像解码缓冲区,同时,类似 Clean memory,也包括 App 所用到的 frameworks。每个 framework 都会有 _DATA 段和 _DATA_DIRTY 段,它们的内存是 Dirty 的。
值得注意的是,在使用 framework 的过程中会产生 Dirty Memory,使用单例或者全局初始化方法是减少 Dirty Memory 不错的方法,因为单例一旦创建就不会销毁,全局初始化方法会在 class 加载时执行。 -
Compressed Memory
当内存吃紧的时候,系统会将不使用的内存进行压缩,直到下一次访问的时候进行解压。
例如,当我们使用 Dictionary 去缓存数据的时候,假设现在已经使用了 3 页内存,当不访问的时候可能会被压缩为 1 页,再次使用到时候又会解压成 3 页。 -
内存泄漏(memory leak)
是指申请的内存空间使用完毕之后未回收。 一次内存泄露危害可以忽略,但若一直泄漏,无论有多少内存,迟早都会被占用光,最终导致程序crash
。(因此,开发中我们要尽量避免内存泄漏的出现) -
内存溢出(out of memory)
是指程序在申请内存时,没有足够的内存空间供其使用。 通俗理解就是内存不够用了,通常在运行大型应用或游戏时,应用或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出。最终导致机器重启
或者程序crash
。
二、从哪些方面优化
-> 更多参考
-
视图层级很多的情况做一些处理
-
对一些大的数据或者资源的处理
-
对很多对象的处理
-
避免内存抖动太大,比如可以用@autoreleasepool 处理for循环大量临时对象造成的问题。
-
内存泄露的处理
-
收到内存警告时候做一些处理,比如用 NSCache 代替 NSDictionary,使用 NSPurgableData 代替NSData。让系统在内存不足情况下自己清理内存。
-
对图片的处理,比如格式的选择,或者缩放等。
三、如何去分析及监控内存泄漏
第一种:静态分析方法(Analyze)
第二种:动态分析方法(Instrument工具库里的Leaks)。一般推荐使用第二种。
- 静态分析
第一步:通过Xcode打开项目,然后点击Product->Analyze,开始进入静态内存泄漏分析。
第二步:等待分析结果。
第三步:根据分析的结果对可能造成内存泄漏的代码进行排查。
PS:静态内存泄漏分析能发现大部分问题,但只是静态分析,并且并不准确,只是有可能发生内存泄漏。一些动态内存分配的情形并没有分析。如果需要更精准一些,那就要用到下面要介绍的动态内存泄漏分析方法(Instruments工具中的Leaks方法)进行排查。
-
动态分析
第一步:通过Xcode打开项目,然后点击Product->Profile,如下图所示:
image.png
第二步:按上面操作,build成功后跳出Instruments工具,如上图右侧图所示。选择Leaks选项,点击右下角的【choose】按钮。如下图:
image.png
第三步:这时候项目程序也在模拟器或手机上运行起来了,在手机或模拟器上对程序进行操作,工具显示效果如下:
image.png
点击左上角的红色圆点,这时项目开始启动了,由于Leaks是动态监测,所以手动进行一系列操作,可检查项目中是否存在内存泄漏问题。如图所示,橙色矩形框中所示绿色为正常,如果出现如右侧红色矩形框中显示红色,则表示出现内存泄漏。
image.png
四、相关工具
监控内存
-
Xcode Debug Area
-
Instruments
-
DebugMemoryGraph
线上检查工具
Allocations
- FBAllocationTracker
Leaked memory
-
MLeaksFinder
-
FBRetainCycleDetector
参考链接
https://www.jianshu.com/p/015132faf9ee
https://blog.csdn.net/TechAlleyBoy/article/details/66973983
https://juejin.im/post/6844903681649803278#heading-2
https://blog.csdn.net/YCM1101743158/article/details/77508192
网友评论