原文地址:https://developer.apple.com/library/ios/technotes/tn2434/_index.html#//apple_ref/doc/uid/DTS40017252 这个文档是 指导利用instrument 来分析App内存的,受益匪浅啊!!! 优化App的内存技术文档TN2434优化App内存内存的优化像App的交互性和稳定性一样也是非常重要的。我们都不难发现App在不同的设备和不同系统中所占的内存也是不同的,而我们的设备内存是有限的。减少app对设备内存的占用,是保证App在设备上运行流畅避免因设备内存不足而崩溃的最好的途径。另外,用内存分析工具来检测app创建出对象的内存管理可以直观的展示内存的实时变化。简介 主题释义内存管理配置结果分析结论关联数据文档历史版本简介:本文档提供了利用Xcode分析App内存的配置步骤。以粒度级分析App的内存有时候可以得出惊人的结果。进一步减少创建对象是一种保障app运行在较低内存状态的最简单有效的方法。重要说明:本例名为Ascii Man,是一个真实的正在开发的游戏项目。项目基于 OpenGL ES 开发的一款2D游戏,其渲染画面所耗费的内存很大。条目释义:内存记录指的是app中创建的对象,在系统内存中存在的状态。配置Xcode:1. Xcode>项目菜单>配置2. 选择内存分析3. 点击记录按钮4. 导航区展示的就是内存占用情况:例如项目的主线程占用或者当前线程的占用5. 让app运行几分钟,保证分析工具搜集一些内存数据信息6. 点击停止按钮停止分析。7. 选择一个需要分析的时间段,分析结果会在下面的结果汇总区展现表一:按住command键,点击图中中1,2处标记范围;表二:在选中区域代表创建的对象所占内存:包含程序启动时加载创建的对象内存,选择的时间段中包含了app的主要内存占用,当然这也是内存优化最好的切入点。【说明】App创建对象和释放对象都是需要时间的。在这个时间段中减少对象的内存不仅能够加快对象的创建而且能够为展示提供更多的内存占用。8. 现在开始分析你结果【说明】此分析数据源于一个正在开发的App,其内存占用显著的展示了Ap p的内存占用情况。因此,以下的分析内容是为了例证我们主题。其内存是使用情况可能和你的App不同,但是内存占用和分析等方面是一致的。表三:在内存对象分析区域展示:a. 持续存在的内存是本文分析的重点。展示的是App当前占用的总内存。也就是说All Heap&Anonymous VM 代表的就是App占用内存。我们要优化的就是此部分内存,持续占有的内存越小,App的运行速度越快,内存警告的可能性就越小。【重要说明】在iOS,tvOS,watchOS系统中,由于设备的内存有限,持续战友内存比较高的话会导致App闪退。b. 持续占用另外一个关键点。它代表了重复创建对象的总数。【说明】本例只展示了两个内存分析的指标,其他指标的分析详见以下文档:用户指导>内存分析工具>详细指标分析结果分析:此部分旨在分析上一节中获取到的内存数据,分析App内存占用如下:【重要说明】默认内存分析结果是按照持续占有的内存字节数将序展示。如果结果不是按照降序排序的可以点击箭头选择降序。1. 先看内存创建的第一部分:表4:第一部分Malloc 96kib。a. 此部分创建的内存空间是96k。重复创建144次造成13.5M的内存占有,占总内存的34%。b. 点击朝右的按钮跳转到144重复创建的列表。表5:现在按照调用者负责的方式,查看一下对象的创建位置。【说明】点击调用者应用条目,按照调用者分类排列、a. 114条中的前10条来源于readImage:方法调用;b. 剩余的其它条目来源于checkAndAllocate:方法调用。表6:选择调用重复度最高一行,分析造成此内存占有的原因。表7:展示创建对象在栈队列中轨迹。a. 点击展示右侧面板按钮;b. 点击“E“,展示扩展详情;c. 查看堆栈跟踪,记录调用的方法。表8:双击调用的方法,将展示创建对象的堆栈跟踪情况。【说明】你可以看到源代码中的位置。只显示源代码中内存占用的位置,不会展示静态库中的位置。表9:创建对象的在代码中的位置:a. 第350行代码,创建的对象占用了12.56MB的内存空间;b. 第348行代码,创建的对象占用了1KB的内存空间,可以忽略。减少内存创建的方法:由于此行代码占总内存的34%。优化这一行代码就可能减少很多内存占用。采用一种基于几何投影的内存切片方法来优化内存。a. 取消创建内存。基于几何投影的对象创建方式是为了运行时中快速有效创建对象,这种情况适用于对内存要求不是很高的情况。开发者应该考虑采用基于图像的创建方式。b. 减少创建对象的数量。采用不同程度的基于图像掩蔽,开发者还可以考虑减少创建对象的创建。通过监控重复创建的次数,减少调用重复创建对象的方法可以减少对象的创建数量。c. 缩减创建出单个对象所占的内存空间提醒开发者可以通过减小对象所占的内存空间来优化App内存。创建对象所占的内存大小是内存优化的一个关键因素,开发者可以考虑移除不必要的内存占用。2. 接下来分析第二个比较大的内存占用。表10:内存碎片a. 回到展示内存创建结果面板;b. 第二大内存占用是Tile类。通过每次183比特的占用,内存中存在一共7.67MB得内存占用,占总体的19.7%。这种情况,通过检查源码中的重复创建位置来分析。打开内存碎片分析,在xcode中的edite项目中,你可以看到183比特的占用,数组的容量在运行中等于7。优化内存分析:a. 解除占用在种种情况下,移除内存碎片的在内存中的占用是不可行的。这是由于数据结构来决定存在的。b. 减少创建对象的个数 减少创建对象不仅仅是由开发人员编程来决定的,内存碎片的多少很大程度上决定于设计者。因此减少内存碎片的数量还是通过修改项目的设计方案更容易实现。c. 减少创建的对象内存大小 对于开发者来说通过减少内存碎片来减少对象的内存占用,举例如下:1. 红色,绿色和蓝色方法的实现要求动态渲染。Layer个数为7 三个方法一共21。如果以上方法不是必须要实现的方法,开发者一个考虑移除这些方法。通过移除这些方法能够减少将近1M内存占用。2. 动画对内存的占用比较大,通过规定动画数组容量(小于默认分配空间)同样可以为我们省出1.01MB的空间。以上两种方法为我们的App节省出2MB的内存占用,占用总数的5%,而且这只是刚刚开始做内存分析。结论:这个实例中只展示了占用最大的两种情况。因为我们是按照内存占用大小进行排列的,前两种占将近总内存的50%。下一步将分析,剩下的50%占用。优化内存思路:移除占用,减少重复创建次数,减少单个对象占用的空间。每个App都有不同的内存对象,但是优化内存的分析方法基本上都是类似的。相关资源:启发内存相关的资料,请看:用户指导>分析App内存使用情况。历史版本2016.05.23 新文档:用内存分析工具来优化App内存。
我的github