iOS app内存分析套路
Xcode下查看app内存使用情况有2中方法:
- Navigator导航栏中的Debug navigator中的Memory
- Instruments
一.Debug navigator中的Memory
此方法是查看内存最简单直接有效的方法,真机调试时,通过Debug navigator中Memory查看app内存,入口如图
根据这个值查看app内存占用,这个内存是当前app占用的总内存,是堆栈内存、虚拟内存(OpenGL占用的显存算在虚拟内存中里面)的总和。
二.Instruments
启动Instruments的方法是,Product->Profile,经过漫长的编译时间后,出现Instruments界面,下图
Instruments中,可以分析内存的工具有Activity Monitor,Allocations,Leaks。
(1)Leaks
Leaks检测内存泄露的工具,很有用。Leaks运行中,看到下面这个红叉叉就表示有内存泄露了
(2)Allocations
Allocations是检测堆栈内存的,下面的VM tracker检测虚拟内存。Allocations运行起来如下图
Allocations永远比Debug navigator Memory中显示的内存要小,就是因为Allocations中没有统计虚拟内存。iOS把OpenGL占用的显存算作虚拟内存的一部分,下图参考自
When is a Leak not a Leak? Using Heapshot Analysis to Find Undesirable Memory Growth
部分malloc出来的内存也算在虚拟内存中,下图参考自A look at how malloc works on the Mac
(3)Activity monitor
Activity monitor看手机整体内存情况的,这里的显示app内存值和Debug navigator中的Memory显示的值是一样的
其他:
1. app最多能占用多少内存不闪退
占用机器内存的一半左右就会闪退,和系统版本、后台程序数有关。
不同渠道对内存有不同的要求,例如如下某渠道
2. iOS app为什么内存没有泄露,内存却降不下来
eg: 创建大概20个哥布林spine动画,此时内存占用46M,然后释放掉,内存占用竟然还是46M,以为是spine有内存泄露,Leaks检测没有发现内存泄露。反复加载释放20个哥布林,内存都没有超过48M,但是为毛内存没有下降,而是维持在46M左右?
因为(1)图片加入了TextureCache,占用了部分内存(2)malloc出来的一部分内存算到了VM(虚拟内存)中,为了下次malloc速度更快,这部分内存虽然调用了free,但iOS系统依然没有将其回收。这就是上面说的部分malloc出来的内存也算在虚拟内存中。
这可以在mac模拟器上测试,malloc一块4M的内存,然后free之,内存不降
3. 怎么进行app内存测试
(1) 用Leaks检测内存泄露
(2) 反复进入退出一个功能页面,在Debug navigator中看内存是不是持续上升。内存持续上升说明内存漏了。