文档翻译-Minimizing your app's Memory Footprint
- 原文地址: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:
- . Xcode>项目菜单>配置
- . 选择内存分析
- . 点击记录按钮
- . 导航区展示的就是内存占用情况:例如项目的主线程占用或者当前线程的占用
- . 让app运行几分钟,保证分析工具搜集一些内存数据信息
- . 点击停止按钮停止分析。
- . 选择一个需要分析的时间段,分析结果会在下面的结果汇总区展现
- 表一:按住command键,点击图中中1,2处标记范围;
- 表二:在选中区域代表创建的对象所占内存:包含程序启动时加载创建的对象内存,选择的时间段中包含了app的主要内存占用,当然这也是内存优化最好的切入点。
- 【说明】App创建对象和释放对象都是需要时间的。在这个时间段中减少对象的内存不仅能够加快对象的创建而且能够为展示提供更多的内存占用。
- . 现在开始分析你结果
- 【说明】此分析数据源于一个正在开发的App,其内存占用显著的展示了Ap p的内存占用情况。因此,以下的分析内容是为了例证我们主题。其内存是使用情况可能和你的App不同,但是内存占用和分析等方面是一致的。
- 表三:在内存对象分析区域展示:
- a. 持续存在的内存是本文分析的重点。展示的是App当前占用的总内存。也就是说All Heap&Anonymous VM 代表的就是App占用内存。
- 我们要优化的就是此部分内存,持续占有的内存越小,App的运行速度越快,内存警告的可能性就越小。
- 【重要说明】在iOS,tvOS,watchOS系统中,由于设备的内存有限,持续战友内存比较高的话会导致App闪退。
- b. 持续占用另外一个关键点。它代表了重复创建对象的总数。
- 【说明】本例只展示了两个内存分析的指标,其他指标的分析详见以下文档:用户指导>内存分析工具>详细指标分析
- 结果分析:
- 此部分旨在分析上一节中获取到的内存数据,分析App内存占用如下:
- 【重要说明】默认内存分析结果是按照持续占有的内存字节数将序展示。如果结果不是按照降序排序的可以点击箭头选择降序。
- . 先看内存创建的第一部分:
- 表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内存。创建对象所占的内存大小是内存优化的一个关键因素,开发者可以考虑移除不必要的内存占用。
- . 接下来分析第二个比较大的内存占用。
- 表10:内存碎片
- a. 回到展示内存创建结果面板;
- b. 第二大内存占用是Tile类。通过每次183比特的占用,内存中存在一共7.67MB得内存占用,占总体的19.%。
- 这种情况,通过检查源码中的重复创建位置来分析。打开内存碎片分析,在xcode中的edite项目中,你可以看到183比特的占用,数组的容量在运行中等于7。
- 优化内存分析:
- a. 解除占用
- 在种种情况下,移除内存碎片的在内存中的占用是不可行的。这是由于数据结构来决定存在的。
- b. 减少创建对象的个数
- 减少创建对象不仅仅是由开发人员编程来决定的,内存碎片的多少很大程度上决定于设计者。因此减少内存碎片的数量还是通过修改项目的设计方案更容易实现。
- c. 减少创建的对象内存大小
- 对于开发者来说通过减少内存碎片来减少对象的内存占用,举例如下:
- . 红色,绿色和蓝色方法的实现要求动态渲染。Layer个数为7 三个方法一共21。如果以上方法不是必须要实现的方法,开发者一个考虑移除这些方法。通过移除这些方法能够减少将近1M内存占用。
- . 动画对内存的占用比较大,通过规定动画数组容量(小于默认分配空间)同样可以为我们省出1.01MB的空间。
- 以上两种方法为我们的App节省出2MB的内存占用,占用总数的5%,而且这只是刚刚开始做内存分析。
- 结论:
- 这个实例中只展示了占用最大的两种情况。因为我们是按照内存占用大小进行排列的,前两种占将近总内存的50%。下一步将分析,剩下的50%占用。优化内存思路:移除占用,减少重复创建次数,减少单个对象占用的空间。
- 每个App都有不同的内存对象,但是优化内存的分析方法基本上都是类似的。
- 相关资源:
- 启发内存相关的资料,请看:
- 用户指导>分析App内存使用情况。
- 历史版本
- 2016.05. 新文档:用内存分析工具来优化App内存。
我的github github
文档翻译-Minimizing your app's Memory Footprint的更多相关文章
- Android内存管理(4)*官方教程 含「高效内存的16条策略」 Managing Your App's Memory
Managing Your App's Memory In this document How Android Manages Memory Sharing Memory Allocating and ...
- Android 编程下 Managing Your App's Memory
Managing Your App's Memory Random-access memory (RAM) 在任何软件开发环境中都是宝贵的资源,它在物理内存有限的移动操作系统中更为宝贵.虽然 Andr ...
- ARC官方文档翻译! - iPhone App开发外包专区 - 威锋论坛 - 威锋网
CHENYILONG Blog ARC官方文档翻译! - iPhone App开发外包专区 - 威锋论坛 - 威锋网 http://bbs.weiphone.com/read-htm-tid-344 ...
- 【转】iphone - ios app maximum memory budget
https://stackoverflow.com/questions/5887248/ios-app-maximum-memory-budget device: (crash amount/tota ...
- Java (JVM) Memory Model – Memory Management in Java
原文地址:http://www.journaldev.com/2856/java-jvm-memory-model-memory-management-in-java Understanding JV ...
- Best Practices for Performance_1、2 memory、Tips 性能和小的优化点、 onTrimMemory
http://developer.android.com/training/articles/memory.htmlhttp://developer.android.com/tools/debuggi ...
- Android内存管理(2)HUNTING YOUR LEAKS: MEMORY MANAGEMENT IN ANDROID PART 2
from: http://www.raizlabs.com/dev/2014/04/hunting-your-leaks-memory-management-in-android-part-2-of- ...
- Android内存管理(1)WRANGLING DALVIK: MEMORY MANAGEMENT IN ANDROID PART 1
from : http://www.raizlabs.com/dev/2014/03/wrangling-dalvik-memory-management-in-android-part-1-of-2 ...
- android 缓存Bitmap - 开发文档翻译
由于本人英文能力实在有限,不足之初敬请谅解 本博客只要没有注明“转”,那么均为原创,转贴请注明本博客链接链接 Loading a single bitmap into your user interf ...
随机推荐
- 关于Eclipse插件之IWorkbench IWorkbenchWindow IWorkbenchPage |WorkbenchPart......等的总结
1..IWorkbench: workbench是eclipse用户界面中最底层的对象,它建立在Display之上,包含一个或多个IWorkbenchWindow,用于向终端用户呈现信息 当你的wor ...
- 关于Eclipse中校验输入文件名的源代码
Eclipse中测试文件名的方法. 也没有单独的分操作系统.在Talend时解决一个在文本框中输入名字有Bug的一个问题,这个是Eclipse中解决输入名字,对名字校验的部分源码. public IS ...
- 逆向+两次bfs(UVA 1599)
为什么都说简单好想咧.坦白从宽看了人家的代码,涨了好多姿势,, http://blog.csdn.net/u013382399/article/details/38227917 被一个细节坑了.. 2 ...
- MultiMap、BidiMap及LazyMap的使用
一.MultiMap 在日常的开发工作中,我们有的时候需要构造像Map<K, List<V>>或者Map<K, Set<V>>这样比较复杂的集合类型的数 ...
- CSS行高--line-height
遇到的问题:在css中,不理解line-height:1与line-height:1px的区别 发现的过程:最近在学做一个网站的过程中,设置两行文字之间的行高时需要用到line-height,发现了这 ...
- 在Ubuntu中USB连接手机调试
1.打开手机USB调试功能 显示“开发者选项”(开发者选项默认隐藏,一般需要进入到“设置”-->“关于手机”连续点击七次,可将“开发者选项显示出来”) 将“开发者选项”设置为“开启”状态 打开U ...
- js和jQuery创建元素和把元素插入到文档中所用的方法
js创建元素: document.createElement(" 创建的元素"); //“创建的元素”指:p ,h1,div,span........ js插入元素: docu ...
- windows7下系统保护中出现错误“文件名、目录名或卷标语法不正确。(0x8007007B)“ 以及保护设置列表中出现“Windows7_os(c:)(找不到)”选项时的解决方法
windows7下系统保护功能很是鸡肋,有事会出现一下两个问题: 1.出现错误“文件名.目录名或卷标语法不正确.(0x8007007B) 2.保护设置列表中出现“Windows7_os(c:)(找不到 ...
- GitHub使用教程for VS2012
转自:http://www.cnblogs.com/yc-755909659/p/3753355.html 一直以来都想使用Git来管理自己平时积累的小代码,就是除了工作之外的代码了.有时候自己搞个小 ...
- GitHub 基本操作流程
GitHub是最先进的分布式版本控制工具,下面是我学习中总结的操作流程,仅供参考 ----------------------------------------------------------- ...