文档翻译-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 ...
随机推荐
- [改善Java代码]不要随便设置随机种子
建议30: 不要随便设置随机种子 随机数在太多的地方使用了,比如加密.混淆数据等,我们使用随机数是期望获得一个唯一的.不可仿造的数字,以避免产生相同的业务数据造成混乱.在Java项目中通常是通过Mat ...
- 编程计算int类型整数的最大值和最小值
方法一:将一个int类型整数不断加1,加到最大值,再加1,就变成负值(最小值) 最大值就是除最高位外,其余位都为1,-1即是所有位全部是1,右移1位后最高位变0 最小值即是最高位为1,其余位为0, ...
- 【转】测试用例设计——WEB通用测试用例
现在项目做完了,我觉得还是有必要总结一下,学习到的内容.毕竟有总结才能有提高嘛!总结一下通用的东西,不管什么项目基本都可能会遇到,有写地方也有重复的或者有的是按照个人的习惯来总结的不一定都对,有不对的 ...
- inline-block总结
inline-block的内部表现类似block,可以设置宽高,外部表现类似inline,具有不还行的特性. 与float排版有些类似,当内部块级(可设置宽高),水平排列的时候都两者都可以实现. 两者 ...
- sublime text使用技巧
常用快捷键 Ctrl + L 选择整行(按住-继续选择下行) Ctrl + KK 从光标处删除至行尾 Ctrl + Shift+K 删除整行 Ctrl + Shift+D 复制光标所在整行,插 ...
- 存储过程往拼接的sql语句中传递日期值
存储过程往拼接的sql语句中传递日期值 declare @start datetime declare @end datetime set @start='2014-3-1' set @end='20 ...
- SQL获取刚插入的记录的自动增长列ID的值
假设表结构如下: CREATE TABLE TestTable ( id int identity, CreatedDate datetime ) SQL2005获得新增行的自动增长列的语句如下: i ...
- 转 DevExpress-ASPxPageControl 动态添加 TabPage 内容
话不多说想看代码,在细说. 前台,很简单.主要看后台 </dx:ASPxPageControl> 后台,注意注释说明. private void GetUserAttendCellsNew ...
- IOS 解析JSON
- (void)viewDidLoad{ [super viewDidLoad]; // Do any additional setup after loading the view, t ...
- (转)如何在高并发分布式系统中生成全局唯一Id
又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文,后续再奉上.最近还写了一个发邮件的组件以及性能测试请看 <NET开发邮件发送功能的全面教程(含邮件组件源码)> ,还弄了 ...