Android 内存管理机制

九路 等级 944 0 0

前言: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

收藏
评论区

相关推荐

Android开发 常见异常和解决办法(一)
Android Studio是Android开发的理想工具,但是由于版本的更新和配置的差异,会出现很多问题,下面是以《第一行代码 第二版》为基础进行开发学习可能遇见的一些问题及其解决办法。 1.Android Studio 3.0及以上版本找不到Android Device Monitor: 解决办法: (1)在Android Studio中打开终端,如下
Android AOSP基础(一)VirtualBox 安装 Ubuntu
AOSP基础 Android框架层本文首发于微信公众号「刘望舒」 前言在Android进阶三部曲第二部《Android进阶解密》的第一章,我介绍了两种阅读源码的方式,其中一种是从百度网盘:https://pan.baidu.com/s/1ngsZs 将源码下载下来,然后用SouceInsight来查看,这种方式很便捷,适合去阅读源码,但是有两个弊端,一个是无
Java后端部署以及与Android通信注意事项
1 概述 ==== 本文列举了一些`Android`+后端`Java`通信/部署时的问题以及注意事项,覆盖的问题包括但不限于安全组、数据库、路径等,如果各位读者的`Android`端不能正常访问`Java`后端,希望这里的解决方案能帮助到您。 2 分类 ==== 这里将问题分为三类: * `Java`端问题 * `Android`端问题 *
java版本springcloud+springboot+mybatis 分布式 微服务 多租户 电子商务 直播带货 短视频带货 社交电商平台
涉及平台:平台管理(包含自营店面)、商家端(PC端、手机端)、买家平台(PC端、H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 核心架构:Spring Cloud、Spring Boot、Mybatis、Redis、SFTP 前端框架:VUE、Uniapp、Bootstrap/H5/CSS3、IOS、Android、小程
java编程中使用二进制进行权限或状态控制
直接看代码以及注释吧。 @Test public void main() { // PC WEB端 int pc = 1 << 0;// ...0001=1 // Android端 int android = 1 <<
2020年了,Android后台保活还有戏吗?看我如何优雅的实现!
1、引言 ======= 对于移动端IM应用和消息推送应用的开发者来说,Android后台保活这件事是再熟悉不过了。 自从Android P(即Android 8.0)出现以后,Android已经从系统层面将后台保活这条路给堵死了(详见:《[Android P正式版即将到来:后台应用保活、消息推送的真正噩梦](https://www.oschina
2020年了,Android后台保活还有戏吗?看我如何优雅的实现!
1、引言 ======= 对于移动端IM应用和消息推送应用的开发者来说,Android后台保活这件事是再熟悉不过了。 自从Android P(即Android 8.0)出现以后,Android已经从系统层面将后台保活这条路给堵死了(详见:《[Android P正式版即将到来:后台应用保活、消息推送的真正噩梦](https://www.oschina
Andriod SDK Manager国内无法更新的解决方案
由于GWF,使用android sdk manager无法更新了,另外android源码也下载不了,幸而国内有很多开源镜像,可以帮助我们解决这些问题 1\. 如何更新Android SDK Manager 设置代理host为mirrors.neusoft.edu.cn,端口为80,即可正常同步 ![](http://static.oschina.net
Android SDK Android Studio Android NDK 官方下载地址
2014.12 Android Studio https://dl.google.com/dl/android/studio/install/1.0.1/android-studio-bundle-135.1641136.exe https://dl.google.com/dl/android/studio/install/1.0.1/andro
Android Wear来袭,极客学院全球首发破解可穿戴系统系列课程
![](http://static.oschina.net/uploads/space/2014/0403/141247_Qz6G_1582301.jpg) 3月18日谷歌公司正式宣布发布Android Wear,矛头直指可穿戴设备。 Android系统在手机、平板电脑端的统治地位已经毋庸置疑,它的延展性和易用性也一直都受业界好评,而Android We
Android+Spring Boot 选择+上传+下载文件
2021.02.03更新 ============ 1 概述 ==== 前端`Android`,上传与下载文件,使用`OkHttp`处理请求,后端使用`Spring Boot`,处理`Android`发送来的上传与下载请求。这个其实不难,就是特别多奇奇怪怪的坑,因此,就一句话, 希望各位读者能少走弯路。 2 环境 ==== * `Win10` *
Android与H5混合开发
        Android 和 H5 在移动开发应用中非常广泛。市面上很多App都是使用Android开发的,但使用Android来开发一些比较复杂附属类,提示性的页面是得不偿失的。而H5在制作炫酷动画网页方面比较给力,且具有开发速度快,更新不用依赖于App的更新,只需要服务端更新相应的页面即可,所以App和H5页面相结合就显得尤为重要。而android
Android学习系列笔记(五)
##Android基础网络第二天 1 post方式提交数据乱码的解决 ================= 一般在公司开发客户端和服务端的编码要保持一致。 android端的默认编码是utf-8; 做url请求时需要对参数进行URLEncode编码. URL url = new URL("http://1
Android音乐播放器开发(6)—歌曲播放列表
1\. 说明 ------ 本文很早就开始写了,不过中间把电脑借给小伙伴了,后来就忘了这件事了… 内容已同步到[Gitee仓库](https://gitee.com/Sjcun/android-MusicPlayer) 以往的文章 * 服务端:[Android音乐播放器开发–服务端](https://www.oschina.net/action/
Kotlin Hello World
1 Kotlin ======== Kotlin是一种在JVM上运行的静态类型编程语言,被称为Android界的Wsift,由JetBrains设计。Kotline可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。Google宣布在Google I/O 2017上宣布Kotlin成为Android官方语言。 笔者不