iOS app内存分析套路

时间:2023-03-09 03:18:24
iOS app内存分析套路

iOS app内存分析套路

Xcode下查看app内存使用情况有2中方法:

  1. Navigator导航栏中的Debug navigator中的Memory
  2. Instruments

一.Debug navigator中的Memory

此方法是查看内存最简单直接有效的方法,真机调试时,通过Debug navigator中Memory查看app内存,入口如图

iOS app内存分析套路

根据这个值查看app内存占用,这个内存是当前app占用的总内存,是堆栈内存、虚拟内存(OpenGL占用的显存算在虚拟内存中里面)的总和。

二.Instruments

启动Instruments的方法是,Product->Profile,经过漫长的编译时间后,出现Instruments界面,下图

iOS app内存分析套路

Instruments中,可以分析内存的工具有Activity Monitor,Allocations,Leaks。

(1)Leaks

Leaks检测内存泄露的工具,很有用。Leaks运行中,看到下面这个红叉叉就表示有内存泄露了

iOS app内存分析套路

(2)Allocations

Allocations是检测堆栈内存的,下面的VM tracker检测虚拟内存。Allocations运行起来如下图

iOS app内存分析套路

Allocations永远比Debug navigator Memory中显示的内存要小,就是因为Allocations中没有统计虚拟内存。iOS把OpenGL占用的显存算作虚拟内存的一部分,下图参考自

When is a Leak not a Leak? Using Heapshot Analysis to Find Undesirable Memory Growth

iOS app内存分析套路

部分malloc出来的内存也算在虚拟内存中,下图参考自A look at how malloc works on the Mac

iOS app内存分析套路

(3)Activity monitor

Activity monitor看手机整体内存情况的,这里的显示app内存值和Debug navigator中的Memory显示的值是一样的

iOS app内存分析套路

其他:

1. app最多能占用多少内存不闪退

占用机器内存的一半左右就会闪退,和系统版本、后台程序数有关。

iOS app内存分析套路

不同渠道对内存有不同的要求,例如如下某渠道

iOS app内存分析套路

2. iOS app为什么内存没有泄露,内存却降不下来

eg: 创建大概20个哥布林spine动画,此时内存占用46M,然后释放掉,内存占用竟然还是46M,以为是spine有内存泄露,Leaks检测没有发现内存泄露。反复加载释放20个哥布林,内存都没有超过48M,但是为毛内存没有下降,而是维持在46M左右?

iOS app内存分析套路

因为(1)图片加入了TextureCache,占用了部分内存(2)malloc出来的一部分内存算到了VM(虚拟内存)中,为了下次malloc速度更快,这部分内存虽然调用了free,但iOS系统依然没有将其回收。这就是上面说的部分malloc出来的内存也算在虚拟内存中。
这可以在mac模拟器上测试,malloc一块4M的内存,然后free之,内存不降

3. 怎么进行app内存测试

(1) 用Leaks检测内存泄露
(2) 反复进入退出一个功能页面,在Debug navigator中看内存是不是持续上升。内存持续上升说明内存漏了。