Android 内存管理机制

九路
• 阅读 1585

前言:Android系统是基于Linux内核开发的操作系统,而Linux系统有其独到的内存管理机制,会在进程活动停止后结束该进程。Android在此基础上优化了内存管理,会把进程都保存在内存中,直到系统需要更多内存为止,释放部分进程。这些被保存在内存中的进程,并不会影响系统的运行速度,相反,在重新打开这些进程时,会提升进程启动速度

Android 内存管理

1. 内存分配机制

Android为每个进程分配内存的时候,采用了弹性的分配方式,也就是刚开始并不会一下分配很多内存给每个进程,而是给每一个进程分配一个“够用”的量。这个量是根据每一个设备实际的物理内存大小来决定的。随着应用的运行,可能会发现当前的内存可能不够使用了,这时候Android又会为每个进程分配一些额外的内存大小。但是这些额外的大小并不是随意的,也是有限度的,系统不可能为每一个App分配无限大小的内除。

Android系统的宗旨是最大限度的让更多的进程存活在内存中,因为这样的话,下一次用户再启动应用,不需要重新创建进程,只需要恢复已有的进程就可以了,减少了应用的启动时间,提高了用户体验。

2. 回收机制

Android 的每个应用程序都会使用一个专有的Dalvik(ART4.4以上)虚拟机实例来运行,它是由Zygote服务进程演变过来的,每个应用程序都在独立的进程中运行。好处如下:

  • 如果程序在运行过程中出现了内存泄漏的问题,仅仅会使得自己的进程被杀掉,而不会影响其他进程
  • Android为不同类型的进程分配了不同的内存使用上限,如果应用进程使用的内存超过了这个上限, 则会被系统视为内存泄漏,从而被杀掉。
  • Android会为每个应用程序分配一个单独的LINUX用户。Android会尽量保留一个正在运行进程,只在内存资源出现不足时,Android会尝试停止一些进程从而释放足够的资源给其他新的进程使用, 也能保证用户正在访问的当前进程有足够的资源去及时地响应用户的事件。Android会根据进程中运行的组件类别以及组件的状态来判断该进程的重要性,Android会首先停止那些不重要的进程。按照重要性从高到低一共有五个级别就是我们常说的:前台进程、可见进程、服务进程、后台进程、空进程。

简单说:

  • 每个应用程序都是一个独立的进程,互不影响,进程死掉不会导致系统崩溃,重启。
  • 每个应用程序都有内存上限,接近,超过都会被kill

Android进程种类

1. 前台进程(foreground)

目前正在屏幕上显示的进程和一些系统进程。举例来说,Dialer,Storage,Google Search等系统进程就是前台进程;再举例来说,当你运行一个程序,如浏览器,当浏览器界面在前台显示时,浏览器属于前台进程(foreground),但一旦你按home回到主界面,浏览器就变成了后台程序(background)。我们最不希望终止的进程就是前台进程。

2. 可见进程

可见进程是一些不再前台,但用户依然可见的进程,举个例来说:widget、输入法等,都属于visible。这部分进程虽然不在前台,但与我们的使用也密切相关,我们也不希望它们被终止(你肯定不希望时钟、天气,新闻等widget被终止,那它们将无法同步,你也不希望输入法被终止,否则你每次输入时都需要重新启动输入法)

3. Service进程

这个相信大家都熟悉,也就是我们常说的service,能够运行在后台,常见的有音乐类的app

4.后台进程

即是后台进程(background),就是我们通常意义上理解的启动后被切换到后台的进程,如浏览器,阅读器等。当程序显示在屏幕上时,他所运行的进程即为前台进程(foreground),一旦我们按home返回主界面(注意是按home,不是按back),程序就驻留在后台,成为后台进程(background)。后台进程的管理策略有多种:有较为积极的方式,一旦程序到达后台立即终止,这种方式会提高程序的运行速度,但无法加速程序的再次启动;也有较消极的方式,尽可能多的保留后台程序,虽然可能会影响到单个程序的运行速度,但在再次启动已启动的程序时,速度会有所提升。这里就需要用户根据自己的使用习惯找到一个平衡点

5. 空进程

没有任何东西在内运行的进程,有些程序,比如BTE,在程序退出后,依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是提高该程序下次的启动速度或者记录程序的一些历史信息。这部分进程无疑是应该最先终止的。

进程的优先级

进程的优先级依次从高到低是前台进程可见进程Service进程后台进程空进程

参考

还有一篇文章写的非常好https://www.cnblogs.com/lianghe01/p/6617275.html

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
刘望舒 刘望舒
3年前
Android包管理机制(一)PackageInstaller的初始化
Android框架层Android包管理机制Android框架层本文首发于微信公众号「刘望舒」前言包管理机制是Android中的重要机制,是应用开发和系统开发需要掌握的知识点之一。包指的是Apk、jar和so文件等等,它们被加载到Android内存中,由一个包转变成可执行的代码,这就需要一个机制来进行包的加载、解析、管理等操作,这就是包管理机制。包管理
记住几种出现内存泄漏的点
Android内存优化——常见内存泄露及优化方案如果一个无用对象(不需要再使用的对象)仍然被其他对象持有引用,造成该对象无法被系统回收,以致该对象在堆中所占用的内存单元无法被释放而造成内存空间浪费,这中情况就是内存泄露。在Android开发中,一些不好的编程习惯会导致我们的开发的app存在内存泄露的情况。下面介绍一些在Android开发中常见的内存泄
并发编程
并发编程笔记本博客根据学习而做的笔记,链接如下一、基本概念1、进程与线程进程程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理IO的。当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。进程
李志宽 李志宽
2年前
android平台注入技术
背景在android系统中,进程之间是相互隔离的,两个进程之间是没办法直接跨进程访问其他进程的空间信息的。那么在android平台中要对某个app进程进行内存操作,并获取目标进程的地址空间内信息或者修改目标进程的地址空间内的私有信息,就需要涉及到注入技术。通过注入技术可以将指定so模块或代码注入到目标进程中,只要注入成功后,就可以进行访问和篡改目标进程空间内
Stella981 Stella981
3年前
Android low memory killer 机制
Android中,进程的生命周期都是由系统控制的。即使用户在界面上关掉一个应用,切换到了别的应用,那个应用的进程依然是存在于内存之中的。这样设计的目的是为了下次启动应用能更加快速。当然,随着系统运行时间的增长,内存中的进程可能会越来越多,而可用的内存则将会越来越少。AndroidKernel会定时执行一次检查,杀死一些进程,释放掉内存。那么,如何来判断
Stella981 Stella981
3年前
Linux 多线程编程
1.Linux“线程”进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型。Linux是一种“多进程单线程”的操作系统。Linux本身只有进程的概念,而其所谓的“线程”本质上在内核里仍然是进程。大家知道,进程是资源分配的单位,同一进程中的多个线程共享该进程的资源(如作为共享内存的全局变量)。Linux
Stella981 Stella981
3年前
PostgreSQL
内存上下文背景:需要经常处理大量以指针传值的查询,存在内存泄漏的问题,直到查询结束才能收回内存。所以实现了新的内存管理机制内存上下文(MemoryContext)内存上下文通俗解释:一个内存上下文相当于一个进程环境,进程环境间不互相影响,pgSQL提供了在内存上下文进行内存操作的函数:pallloc、pfree、repalloc
Stella981 Stella981
3年前
Android的进程管理
Android的进程管理很有意思,因为这个在其它系统是不存在的.谁启动了进程谁负责关闭进程,OS基本不插手或者说最少没有系统化的对进程的管理.传统的OS更关注对处理器资源的调度,对内存管理的重点在分配与回收,只是机械化的一个服务过程,系统与进程在那里的关系更象是一种服务关系.但是Android把进程当肉腩,想宰就宰.并且更"离谱"的是,