大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢

转载请标明出处(http://blog.csdn.net/kifile),再次感谢

原文地址:http://developer.android.com/training/articles/memory.html

在接下来的一段时间里,我会每天翻译一部分关于性能提升的Android官方文档给大家

建议大家在看本文之前先去我的博客看看

[Android
性能优化系列]内存之基础篇--Android怎样管理内存

[Android
性能优化系列]内存之终极篇--减少你的内存消耗

以下是本次的正文:

################

应用应该怎样管理内存

在软件开发的各个阶段,你都应该时候注意你的RAM消耗(即便是在括软件的设计阶段)。这里有非常多种途径。通过使用它们能够帮助你设计和写出更有效率的代码。

你应该在设计和实现应用的时候採用下面的这些技术来让减少应用的内存消耗。

尽可能少的使用服务

假设你的应用须要使用服务来进行后台操作,那么尽可能让他在的确须要工作的时候才进行工作。

另外请确保当你的工作完毕之后结束掉你的服务。

当你开启一个服务的时候,系统会在服务执行的时候保留它的进程,这会让这个进行变得很庞大。由于服务所消耗的资源不能被其它应用使用或者回收。这就会导致保存在LRU缓存中的进程数量降低。使得切换应用的时候效率降低。当后台有足够多的服务正在执行的时候,他甚至可能导致整个系统由于内存紧张而崩溃掉。

管理你的服务最简单的方法是使用一个IntentService,他会在他处理完事件之后自行关闭掉服务。详情请參看使用前台服务

当不须要的时候还让服务一直在后台执行是内存管理中最不应该犯的错之中的一个。因此不要贪心的让自己的服务一直在后台执行,这不仅会导致你应用的性能变低,用户也有可能发现应用的这样的行为而且卸载他。

当用户界面隐藏起来的时候,释放掉内存资源

当用户切换到其它应用,你的ui界面不可见的时候。你就应该释放掉那些被自己界面使用的资源。在这个时候释放掉ui资源可以显著提升系统存放缓存进程的数目,这可以极大的提升用户体验。

当你应用中的全部进程的界面对于用户而言都不可见的时候。会触发onTrimMemory()的回调接口。带着一个TRIM_MEMORY_UI_HIDDEN參数。

这个接口同OnStop()的回调接口的不同在于 OnStop()接口会在应用跳转的时候被调用,而onTrimMemory接口仅仅有在全部界面都不可见的情况下被调用。虽然你须要实现onStop()方法来释放掉Activity资源,比如网络訪问或者注销掉广播接收器,但这还不够。你不应该在onTrimMemory之前就释放掉你的ui资源。

这可以保证用户通过返回键返回到你的应用中,你的ui资源相同存在,并且可以高速的显示出来。

当内存不足时释放掉一些内存

在你的应用的生命周期中,onTrimMemory()接口相同会在当整个设备的内存变得非常低的时候被调用。

你应该依据从onTrimMemory()中传来的内存等级,选择性的释放掉你资源

TRIM_MEMORY_RUNNING_MODERATE

你的应用正在执行,不可被杀死,可是眼下设备剩余内存非常少,系统须要从LRU缓存中杀死掉一些进程

TRIM_MEMORY_RUNNING_LOW

你的应用正在执行,不可被杀死。可是眼下设备剩余内存不足临界值,因此你须要释放掉不是用的内存来提升系统执行效率

TRIM_MEMORY_RUNNING_CRITICAL

你的应用正在执行,可是系统已经准备杀死大多数LRU中的进程,因此你应该释放掉那些不是非常关键的资源。

假设系统不能通过回收得到足够的RAM,那么他会清空全部LRU缓存,而且開始杀死那些希望保留的进程,比如拥有一个正在执行后台服务的进程。

相同的。当你的应用正在处于缓存中的时候,你可能会受到下面几个onTrimMemory()等级

TRIM_MEMORY_BACKGROUND

系统正在执行在低内存状态。而你的进程处在LRU列表的開始部分。

因此虽然你的应用进程不太可能被杀死。可是系统已经转杯開始杀死LRU中的进程。你应该释放掉那些easy被还原的资源。来确保你仍然在列表中。而且在用户返回到应用的时候可以高速的进行切换

TRIM_MEMORY_MODERATE

系统正在执行在低内存阶段,你的进程处于LRU列表的中部。增加系统无法获得足够的内存资源,你的应用将会被杀死

TRIM_MEMORY_COMPLETE

系统正在执行在低内存阶段。你的进程将会是最開始被系统杀死的进程之中的一个,你应该释放掉全部与你的应用状态无关的资源。

尽管因为onTrimMemory()接口直到API14的时候才被增加。你还是能够使用onLowMemory接口来作为老版本号的回调,他能够同onTrimMemory()中TRIM_MEMORY_COMPLETE的等级一样。

注意:当系统開始杀死在LRU缓存中的进程时。虽然他是从下至上開始的。可是他也会考虑优先杀死那些内存消耗比較大的,以回收很多其它的系统资源。因此,假设你的应用的内存尽可能低。你就可能被始终保留在内存中,可以非常快切换回来

推断你应该拥有多少内存

正如之前所提到的。每个Android设备都会依据自身RAM大小的不同来向应用提供不同大小的堆限制。你能够通过getMemoryClass()来得到应用可能拥有的堆的大小。增加你的应用当内存不足的时候却分配很多其它的内存,那么就会造成OOM

在一种很特殊的情况加,你能够通过设置manifest文件里<application>标签里的largeHeap的属性为true。假设你这么做,那么你能够通过getLargeMemoryClass()来获取你个比較大的堆的评估值。

虽然如此。最好仅仅有那些真正须要很多其它内存空间的应用才请求一个更大的堆空间,比如一个大型的图像编辑应用。

记住不要由于你内存溢出就去申请一个大型堆。你须要知道仅仅有你明确你的内存被分配到哪儿了,为什么他一直被保留着。

当你确信你的应用须要一个大型堆的时候,你应该避免任意浪费他,使用额外的内存会极大的影响用户的体验,由于垃圾回收会消耗很多其它的事件,而且系统的效率会在应用切换或者其它的操作上变得更慢

此外,一个大型堆的大小在不同的设备上不一样。当执行在某些拥有限制内存的设备上时。大型堆的大小可能同普通堆得大小一模一样。因此即使你使用了大型堆,你也应该通过getMemoryClass()来检查真正的堆的尺寸,以确保只是超出限制。

[Android 性能优化系列]内存之提升篇--应用应该怎样管理内存的更多相关文章

  1. [Android 性能优化系列]内存之基础篇--Android怎样管理内存

    大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...

  2. [Android 性能优化系列]降低你的界面布局层次结构的一部分

    大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...

  3. Android性能优化系列之App启动优化

    Android性能优化系列之布局优化 Android性能优化系列之内存优化 Android性能优化系列之apk瘦身 应用的启动速度缓慢是我们在开发过程中常常会遇到的问题,比方启动缓慢导致的黑屏.白屏问 ...

  4. Android性能优化系列之apk瘦身

    Android性能优化系列之布局优化 Android性能优化系列之内存优化 为什么APK要瘦身.APK越大,在下载安装过程中.他们耗费的流量会越多,安装等待时间也会越长:对于产品本身,意味着下载转化率 ...

  5. Android性能优化第(三)篇---MAT比Menmery Monitor更强大

    作者 LooperJing 2016.11.17 16:42* 字数 1687 阅读 1603评论 3喜欢 21 在Android性能优化第(一)篇---基本概念中讲了JAVA的四大引用,讲了一下GC ...

  6. Android性能优化系列 + Android官方培训课程中文版

    Android性能优化典范 - 第6季 http://hukai.me/android-performance-patterns-season-6/   Android性能优化典范 - 第5季 htt ...

  7. Android性能优化系列之电量优化

    电量消耗的计算与统计是一件麻烦而且矛盾的事情,记录电量消耗本身也是一个费电量的事情,随着Android开的性能要求越来越高,电量的优化,也显得格外重要,一个耗电的应用,用户肯定会毫不犹豫的进行卸载,所 ...

  8. Android性能优化系列总篇

    目前性能优化专题已完成以下部分: 性能优化总纲——性能问题及性能调优方式 性能优化第四篇——移动网络优化 性能优化第三篇——Java(Android)代码优化 性能优化第二篇——布局优化 性能优化第一 ...

  9. Android性能优化第(二)篇---Memory Monitor检测内存泄露

    上篇说了一些性能优化的理论部分,主要是回顾一下,有了理论,小平同志又讲了,实践是检验真理的唯一标准,对于内存泄露的问题,现在通过Android Studio自带工具Memory Monitor 检测出 ...

随机推荐

  1. CentOS7/RedHat7的Apache配置介绍

    这里我们介绍yum安装httpd yum install -y httpd ************* [root@100 ~]# systemctl restart httpd [root@100 ...

  2. CSS 类、伪类和伪元素差别具体解释

    CSS中的类(class)是为了方便过滤(即选择)元素,以给这类元素加入样式,class是定义在HTML文档树中的. 可是这在一些情况下是不够用的,比方用户的交互动作(悬停.激活等)会导致元素状态发生 ...

  3. 新手学,java使用分水岭算法进行图像切割(一)

    近期被图像切割整的天昏地暗的,在此感谢老朋友周洋给我关于分水岭算法的指点!本来打算等彩色图像切割有个完满的结果再写这篇文章,可是考虑到到了这一步也算是一个阶段,所以打算对图像切割做一个系列的博文,于是 ...

  4. vim 基础学习之可视模式

    1. 选择模式这个模式必须通过可视模式进入.在可视模式下,我们通过 <C-g>来把我们的可视选中块作为选择模式下的操作块. 这时候我们输入可见字符,就会把这个块给覆盖掉.例如aaa bbb ...

  5. UICollectionView——整体总结

    前言 这几天有时间看了下UICollectionView的东西,才发觉它真的非常强大,很有必要好好学习学习.以前虽然用过几次,但没有系统的整理总结过.这两天我为UICollectionView做一个比 ...

  6. POJ 2458 DFS+判重

    题意: 思路: 搜+判重 嗯搞定 (听说有好多人用7个for写得-.) //By SiriusRen #include <bitset> #include <cstdio>0 ...

  7. 洛谷P3531 [POI2012]LIT-Letters

    题目描述 Little Johnny has a very long surname. Yet he is not the only such person in his milieu. As it ...

  8. Self-Taught Learning to Deep Networks

    In this section, we describe how you can fine-tune and further improve the learned features using la ...

  9. Kinect 开发 —— Hello,Kinect

    控制台输出深度数据: using System; using System.Collections.Generic; using System.Linq; using System.Text; usi ...

  10. 【Codeforces Round #456 (Div. 2) A】Tricky Alchemy

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 统计需要的个数. 不够了,就买. [代码] #include <bits/stdc++.h> #define ll lo ...