退出但不关闭:
  这是Android对于Linux的优化。当 Android 应用程序退出时,并不清理其所占用的内存,Linux 内核进程也相应的继续存在,所谓“退出但不关闭”。从而使得用户调用程序时能够在第一时间得到响应。
  应用切换到后台是暂停的,完全不耗cpu和电量,只保留了运行状态。如果app需要后台处理事务(放音乐),那么app进程会开启相应的服务,所以在后台有消耗的只有服务。
  占用CPU的应用才耗电,后台的只占内存,所以是不耗电的。
默认回收机制:
  当系统内存不足时,系统将激活内存回收过程。为了不因内存回收影响用户体验(如杀死当前的活动进程),
回收优先级:
  Android 基于进程中运行的组件及其状态规定了默认的五个回收优先级:
  IMPORTANCE_FOREGROUND:前台进程,目前正在屏幕上显示的进程和一些系统进程。
  IMPORTANCE_VISIBLE:可见进程,可见进程是一些不再前台,但用户依然可见的进程,比如输入法、天气、时钟等。
  IMPORTANCE_SERVICE:服务进程,拨号、邮件存储之类的。
  IMPORTANCE_BACKGROUND:后台进程,启动后被切换到后台的进程。
  IMPORTANCE_EMPTY:没有任何东西在内运行的进程,有些程序,比如BTE,在程序退出后,依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是  提高该程序下次的启动速度或者记录程序的一些历史信息。
  home app:桌面进程,即launcher,保证在多任务切换之后,可以快速返回到home界面而不需重新加载launcher。
  系统会对进程的重要性进行评估,并将重要性以“oom_adj”这个数值表示出来。前台程序的“oom_adj”值为0,这意味着它不会被系统终止。
  可根据“oom_adj”值的范围来决定进程管理策略,比如可以设定“当内存小于X时,结束“oom_adj”大于Y的进程”。


触发内存回收的阈值:
  进行内存调度有个阀值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西。当然这个值默认设置得很小,所以你会看到内存老在很少的数值徘徊。
  为什么内存少的时候运行大型程序会慢呢,原因是:在内存剩余不多时打开大型程序时会触发系统自身的调进程调度策略,这是十分消耗系统资源的操作,特别是在一个程序频  繁向系统申请内存的时候。这种情况下系统并不会关闭所有打开的进程,而是选择性关闭,频繁的调度自然会拖慢系统。
APP虚拟机:
  安卓Android上的应用是java,当然需要虚拟机,而安卓Android上的应用是带有独立虚拟机的,也就是每开一个应用就会打开一个独立的虚拟机.这样设计的原因是可以避免虚拟机崩溃导致整个系统崩溃,但代价就是需要更多内存。
Home键和返回键:
  Home键用来多任务切换,返回键相当于退出应用程序。
  按home退出,程序保留状态为后台进程;按返回键退出,程序保留状态为空进程。
部分手机home键后程序重启:
  (1)修改manifast如下:
<activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="@string/app_name" android:configchanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:screenorientation="landscape">
http://game.ceeger.com/forum/read.php?tid=9611&fid=2&page=1#115539
  (2)在后台开个服务
  http://bbs.9ria.com/thread-416715-1-1.html
  (3)有一种方法可以设置app永远不会被kill,AndroidManifest.xml 中添加:
  android:persistent="true"
  这样可使应用免受out-of-memory killer的影响
  适用于放在/system/app下的app。
  <application android:name="PhoneApp"
  android:persistent="true"
  android:label="@string/dialerIconLabel"
  android:icon="@drawable/ic_launcher_phone">
  ...
  </application>
  (4)设置runinbackground
  (5)QualitySettings.SetQualityLevel
  (6)是否能够手动设置切换QQ登陆还是网页模式登陆(内存过小时)
  (7)使用软件MinFreeManager设定各类进程触发OOM的阈值

Android内存回收机制的更多相关文章

  1. Android 操作系统的内存回收机制(转载)

    Android 操作系统的内存回收机制(转载) Android APP 的运行环境 Android 是一款基于 Linux 内核,面向移动终端的操作系统.为适应其作为移动平台操作系统的特殊需要,谷歌对 ...

  2. Android 操作系统的内存回收机制[转]

    转自:http://www.ibm.com/developerworks/cn/opensource/os-cn-android-mmry-rcycl/ Android APP 的运行环境 Andro ...

  3. Android内存管理篇 - 从updateOomAdjLocked看lowmemorykiller之外的Android进程回收机制

    提起android的进程回收机制,大家所熟知的是Android的lowmemroykiller的机制.当系统可用内存低于某个阀值时,即会杀死这个阀值对应的Adj值的所有应用.但是本篇文章并为是要介绍L ...

  4. android 内存回收及怎样避免内存泄露

    http://blog.vunso.com/201307/android%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6%E5%8F%8A% ...

  5. linux kernel内存回收机制

    转:http://www.wowotech.net/linux_kenrel/233.html linux kernel内存回收机制 作者:itrocker 发布于:2015-11-12 20:37 ...

  6. JVM内存回收机制简述

    JVM内存回收机制涉及的知识点太多了,了解越多越迷糊,汗一个,这里仅简单做个笔记,主要参考<深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)> 目前java的jdk默认虚拟机为H ...

  7. memcache的内存回收机制

    memcache不会释放内存,而是重新利用. 在缓存的清除方面,memcache是不释放已分配内存.当已分配的内存所在的记录失效后,这段以往的内存空间,memcache只会重复利用. memcache ...

  8. Android内存管理机制之一:low memory killer

    转载自http://www.miui.com/thread-29268-1-1.html 准备写这个专题之前,心里是有点忐忑的.首先Android内存管理机制相当复杂,想要讲清楚比较困难:其次对于绝大 ...

  9. JVM内存回收机制

    1. JVM内存回收机制简述 http://www.cnblogs.com/lzrabbit/p/3826738.html

随机推荐

  1. jsp入门笔记

    jsp语法 1. declaration 由于访问serlvet只有一个,<%! int i = 0; %>   是servlet的变量,刷新时会不断增加 <% int i = 0; ...

  2. 日常工作中的点滴:C# 根据字节长度截包含中文的字符串

    方法中利用正则表达式判断某个字符是否是中文 public string SubStringB(string text,int length){ int target=0; int b=0; for(i ...

  3. 学习django之正则表达式的语法

    正则表达式 正则表达式的常用语法: 1)单个字符: .          任意的一个字符 a|b        字符a或字符b [afg]      a或者f或者g的一个字符 [0-4]      0 ...

  4. js实现xml转化成字符串

    xml字符串转xml dom经常遇到在js里面需要解析xml的问题,然而有时候,后台返回的不是dom 而是string 字符串,需要将字符串转换成dom对象,然后才可以进行节点值解析和读取functi ...

  5. TestNG参数化测试【转】

    原文:http://www.yiibai.com/testng/20130916303.html 在TestNG的另一个有趣的功能是参数测试.在大多数情况下,你会遇到这样一个场景,业务逻辑需要一个巨大 ...

  6. yii2更改面包屑的首页链接

    <?= Breadcrumbs::widget([ 'homeLink' => ['label' => 'Home', 'url' => Yii::$app->getHo ...

  7. c++的转换

    1.静态转换 static_cast 用于明确定义的变换 ,包括 编译器允许的非强制转换和不太安全但定义清楚的变换.ps:(非强制变换,窄化变换,隐式转换,类层次静态定位,void*强制转换) 2.常 ...

  8. Linux(centeros)下安装jdk

    首先需要说明的是有的Linux系统自带jdk,这个jdk是openjdk,可以通过java-version查看 所以安装的步骤是,首先删除系统自带的(如果有)openjdk 1. rpm -qa | ...

  9. centos 清理内存缓存

    读写文件时,Linux内核为了提高读写效率与速度,会将文件在内存中进行缓存,这就是Cache Memory(缓存内存).即使程序运行结束后,Cache Memory也不会自动释放.这就会导致程序频繁读 ...

  10. Redis 系列 (一) StackExchange.Redis的使用

    一.DLL安装 用NuGet搜索StackExchange.Redis,然后下载就可以. ConnectionMultiplexer对象是StackExchange.Redis最中枢的对象.这个类的实 ...