Android性能:内存篇之进程内存管理

在此之前,我们已经通过《Android性能:内存篇之Android虚拟机》聊了Android虚拟机的基础知识及Android所使用的Delvik、ART之间的差异,也在《Android性能:内存篇之内存回收》聊了通用通用的内存回收算法和内存回收机制,接下来我们再了解了解Android中针对进程的内存策略与内存的分配。

默认回收过程

Android 操作系统中的内存回收可分为两个层次,即默认内存回收与内核级内存回收。

Android 系统中内存回收的触发点大致可分为三种情况。
  第一,用户程序调用 StartActivity(), 使当前活动的 Activity 被覆盖;
  第二,用户按 back 键,退出当前应用程序;
  第三,启动一个新的应用程序。这些能够触发内存回收的事件最终调用的函数接口是 activityIdleInternal()。

Low Memory Kill机制

系统出于体验和性能上的考虑,app在退到后台时系统并不会真正的kill掉这个进程,而是将其缓存起来。打开的应用越多,后台缓存的进程也越多。在系统内存不足的情况下,系统开始依据自身的一套进程回收机制来判断要kill掉哪些进程,以腾出内存来供给需要的app, 这套杀进程回收内存的机制就叫 Low Memory Killer ,它是基于Linux内核的 OOM Killer机制诞生。

LMK是放在kernel的一个安卓特有的专用驱动,负责的是杀进程,oom负责的是进程的自杀,两者不一样的。
这个就简单了,当ram不足的时候,会触发这个机制,至于干掉哪个进程:

表面来说,进程有5个等级,更具等级优先级来干掉 前台进程>可见进程>服务进程>后台进程>空进程最后面那个越容易被销毁。

深层来说,进程等级直接反应在文件就是oom_adj的值,值越大越容易被杀,这个值可以在/proc/[pid]/oom_adj看到,注意的是
zygote进程是-16,基本不死的,系统进程也在-12左右,想要你的进程常驻内存,可以在配置文件设置android:persistent,提高oom_adj的值。

进程内存回收原则

下面将从 Application Framework 和 Linux kernel 两个层次分析 Android 操作系统的资源管理机制。

Android 之所以采用特殊的资源管理机制,原因在于其设计之初就是面向移动终端,所有可用的内存仅限于系统 RAM,必须针对这种限制设计相应的优化方案。

当 Android 应用程序退出时,并不清理其所占用的内存,Linux 内核进程也相应的继续存在,所谓“退出但不关闭”。从而使得用户调用程序时能够在第一时间得到响应。

当系统内存不足时,系统将激活内存回收过程。为了不因内存回收影响用户体验(如杀死当前的活动进程),
Android 基于进程中运行的组件及其状态规定了默认的五个回收优先级:IMPORTANCE_FOREGROUND、IMPORTANCE_VISIBLE、IMPORTANCE_SERVICE、IMPORTANCE_BACKGROUND、IMPORTANCE_EMPTY;

这几种优先级的回收顺序是 Empty process、Background process、Service process、Visible process、Foreground process。

ActivityManagerService 集中管理所有进程的内存资源分配。所有进程需要申请或释放内存之前必须调用ActivityManagerService 对象,获得其“许可”之后才能进行下一步操作,或者 ActivityManagerService 将直接“代劳”。

Linux 内核真正回收具体进程:ActivityManagerService对所有进程进行评分(评分存放在变量adj中)更新评分到Linux 内核,由Linux 内核完成真正的内存回收。

Native内存和heap内存

同个应用中,并非所有申请内存都占用堆内存,android中内存分为两块,一个是native内存,是lib层c/才++库所占用的内存;还有一个heap内存,是java实例对象的空间。
在3.0以前,bitmap是分配在native内存当中的,3.0以后都是分配在heap空间的,所以会有我们说的因为图片导致的oom现象,bitmap的优化点,后面会说到。
怎么查看native和heap内存呢,万能DDMS直接可以读到,当然命令dumpsys meminfo也是可以看到的。

更多相关文章

  1. Android(IPC)进程间通讯1:详解Binder由来?
  2. 【整理一点资料】 Andorid的进程和线程模型
  3. 深入理解android之IPC机制与Binder框架
  4. Android内存管理-SoftReference的使用
  5. Linux Kernel and Android(安卓)休眠与唤醒(中文版)
  6. FirefoxOS 系统进程初步分析 底层系统继承自 android
  7. Android内存和外存的学习
  8. 浅谈Android之系统概述
  9. Android之——获取进程总数、内存、任务列表

随机推荐

  1. 最新消息:Android 4.0新增功能
  2. Android绘制基础及手写绘制实例
  3. android之后台线程(UI与线程交互)
  4. 3g android4 移植 飞思卡尔i.MX 6Quad An
  5. Looper中的消息队列处理机制
  6. 实训心得___刘晓刚
  7. AndroidAPP开发者注意了,安卓开发将迎来
  8. android中关于AsyncTask的学习
  9. 【Android教程】Android用户系统管理
  10. 基于xml类型的压缩数据流的android获取天