文档翻译-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 ...
随机推荐
- 【二进制】FZU 2062 Suneast & Yayamao
题意:给出n,问最少需要多少个数字,这些数字能组成1~n的所有数: 分析:n=1; 1; 1个 n=2; 1,1; 2个 1 = 1; 2 = 1+1; n=3; 1,2; 2个 1 = 1; ...
- Java Concurrency - 浅析 CountDownLatch 的用法
The Java concurrency API provides a class that allows one or more threads to wait until a set of ope ...
- Spring(3.2.3) - Beans(6): 作用域
Spring 支持五种作用域,分别是 singleton.prototype.request.session 和 global session. 作用域 说明 singleton (默认作用域)单例 ...
- 第一次知道Winform的窗体之间传值怎么写,分享给小白~
之前为了这事,百度了一天也没找到,最终使用了静态变量了. 窗体Form1: private void button1_Click(object sender, EventArgs e) { var f ...
- sql新手全套
--[数据库]gocreate database DB_MGG --添加数据库on(name=DB_MGG --逻辑名称,filename='C:\MDB\DB_MGG.mdf' --物理名称 逻 ...
- python字符串操作2
在python有各种各样的string操作函数.在历史上string类在python中经历了一段轮回的历史.在最开始的时候,python有一个专 门的string的module,要使用string的方 ...
- PHP学习笔记 - 入门篇(5)
PHP学习笔记 - 入门篇(5) 语言结构语句 顺序结构 eg: <?php $shoesPrice = 49; //鞋子单价 $shoesNum = 1; //鞋子数量 $shoesMoney ...
- UIView-4-EventForViews(在view上加入button时候的事件处理)
#import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...
- OC12_自动释放池
// // Dog.h // OC12_自动释放池 // // Created by zhangxueming on 15/6/18. // Copyright (c) 2015年 zhangxuem ...
- 使用c#检测文件正在被那个进程占用
要检测文件被那个进程占用,需要使用微软提供的工具Handle.exe,这里有微软提供的下载 我们可以在c#中调用Handle.exe 来检测到底哪个进程占用了文件 string fileName = ...