zoukankan      html  css  js  c++  java
  • 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中看内存是不是持续上升。内存持续上升说明内存漏了。

  • 相关阅读:
    I.MX6 Surfaceflinger 机制
    理解 Android Fragment
    RPi 2B DDNS 动态域名
    RPi 2B IPC webcam server
    理解 Android MVP 开发模式
    I.MX6 system.img unpack repack
    can't set android permissions
    VMware Ubuntu 共享文件夹
    解决oracle数据库连接不上的问题
    perfect-scrollbar示例
  • 原文地址:https://www.cnblogs.com/BigFeng/p/6178301.html
Copyright © 2011-2022 走看看