• iOS app内存分析套路


    iOS app内存分析套路

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

    1. Navigator导航栏中的Debug navigator中的Memory
    2. 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中看内存是不是持续上升。内存持续上升说明内存漏了。

  • 相关阅读:
    js阶段循环(for,while,do-while,for-in),判断(if,switch),练习题
    翻牌器
    用 VSCode 调试网页的 JS 代码
    图形化设置数据库规则
    js中ES6数据结构Map 、Set 、WeakMap 、 WeakSet
    css的filter方法,给图片添加滤镜
    使用<a-select>时,placeholder不起作用,提示语不显示
    Vue数据更新但页面没有更新的多种情况
    react事件处理-函数绑定
    在css中使用js定义的变量
  • 原文地址:https://www.cnblogs.com/BigFeng/p/6178301.html
Copyright © 2020-2023  润新知