您的位置:首页 > 移动开发 > Android开发

Android之内存管理机制

2019-08-07 20:49 1961 查看

1、不爽,某日被问到了,结果结结巴巴答不出来,非常不爽

Linux进程的4GB地址空间,每个字节都有一个地址,那么有4G个地址,那就是4G个空间了

 

2、先简单做个铺垫,几个名词要理解一下

A、内存:有个好听的全称->随机存取存储器(英文名:random access memory),简称内存,简称RAM

官方解释:请call搜索引擎

 

B、管理:操作系统是如何使用内存的(怎么分配与怎么回收)

 

C、机制:一种方法、方式、抽象的一种策略
 

所以内存管理机制也可以叫做Andorid是采用何种策略进行分配与回收内存的, 我真俗气,哈哈。

 

3、Let us do it

说到Android的内存管理,有时候容易和ART的内存管理混淆

a、首先是操作系统的内存管理(这块主要就是进程),显然Android的内存管理机制说的是进程的

b、接着就是ART(虚拟机里面)的内存管理,即虚拟机的内存管理,以后每次写,就一定都写明白,分清楚。

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

 

4、Android内存管理机制(进程)

 

a、分配机制

Android为每个进程分配内存的时候,采用了弹性的分配方式,也就是刚开始并不会一下分配很多内存给每个进程,而是给每一个进程分配一个“够用”的量。

这个量是根据每一个设备实际的物理内存大小来决定的。随着应用的运行,可能会发现当前的内存可能不够使用了,这时候Android又会为每个进程分配一些额外的内存大小。但是这些额外的大小并不是随意的,也是有限度的,系统不可能为每一个App分配无限大小的内存。

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

 

b、回收机制 Low Memory Killer机制  , LMK机制

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

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

  • 每个应用程序都是一个独立的进程,互不影响,一个进程死掉,不会导致操作系统崩溃、重启
  • 每个应用程序都有内存上限,接近、超过都会被kill
  • 每个进程都有一个oom_adj值,值越小越安全,越大越容易被操作系统干掉,就是说谁大谁倒霉

Android进程种类(七个)

新增加了桌面进程和内容供应节点


1. 前台进程(foreground)
目前正在屏幕上有组件显示的进程和一些系统进程。

a、举例来说,Dialer,Storage,Google Search等系统进程就是前台进程;

b、再举例来说,当你运行一个程序,如浏览器,当浏览器界面Activity在前台显示时,浏览器进程属于前台进程(foreground),但一旦你按home回到主界面(因为组件不可见了),浏览器就变成了后台程序(background)。我们最不希望终止的进程就是前台进程。


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


3. 桌面进程(home app)
即Launcher这个App,保证在多任务切换之后,可以快速返回到home界面而不需重新加载Launcher


4. 次要服务(secondary server)
目前正在运行的一些服务(主要服务,如拨号等,是不可能被进程管理终止的,故这里只谈次要服务),举例来说:谷歌企业套件,Gmail内部存储,联系人内部存储等。这部分服务虽然属于次要服务,但很一些系统功能依然息息相关,我们时常需要用到它们,所以也太希望他们被终止


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


6. 内容供应节点(content provider)
没有程序实体,该进程提供内容供别的程序去用的,比如日历供应节点,邮件供应节点等。在终止进程时,这类程序应该有较高的优先权


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

 

参考文章:https://www.geek-share.com/detail/2742978980.html

https://www.geek-share.com/detail/2701427180.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: