Android内存管理机制详解

一  与windows内存区别

在linux中经常发现的空闲内存很少,好像所有的内存都被系统占用了,表面感觉是内存不够用。这是linux内存管理的一个优秀特性,主要特点是:无论物理内存有多大,Linux都将其充分利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高Linux系统的数据访问性能。而Windows是只在需要内存时,才为应用程序分配内存,并不能充分利用大容量的内存空间。

二 java的内存管理

在java中,是通过new关键字来为对象分配内存的,而内存的释放是由垃圾收集器(GC)来回收的,工程师在开发的过程中,不需要显式的去管理内心。但是这样有可能在不知不觉就会浪费了很多内存,最终导致java虚拟机花费很多时间去垃圾回收。

1 内存结构

上面这张图是JVM的结构图,它主要四个部分组成:Class Loader子系统、运行时方法区、执行引擎和本地方法区。我们主要看RUNTIME DATA AREA,也就是我们常说的JVM内存。该内存主要由5个部分组成:

(1) Method AREA :被加载的class的元信息存储在Method area中,它是线程共享的;

(2) Heap :一个java虚拟机实例中只存在一个堆空间,存放一些对象信息,它是线程共享的

(3) Java 栈:java虚拟机直接对java栈进行两种操作,以帧为单位的压栈和出栈,它是非线程共享的;

(4) 程序计数器:非线程共享

(5) 本地方法栈: 非线程共享

三  android内存的意义

android程序需要虚拟机,而android上的应用是带有独立虚拟机的,也即是每一个打开应用就会打开一个独立的虚拟机。其实和java的垃圾回收机制类似,系统有一个规则来回收内存,进行内存调度有个阀值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西,当然这个值默认设置得很少,所以你会看到内存老是在很少的数值徘徊。但事实上,并不影响速度。相反加快了下次启动应用的速度。为android的优势之一,人为去关闭进程,没有太大必要。内存少的时候运行大型程序会慢?原因是:在内存剩余不多时打开大型程序时会触发系统自身的调度进程策略。这是十分消耗系统资源的操作,特别是一个程序频繁向系统申请内存的时候。这个时候系统并不是关闭所有打开的进程,而是选择关闭,频繁的调度自然会拖慢系统。

四 android内存管理的原理,及相关自动内存管理软件原理

Android采取了一种有别于Linux的进程管理策略,有别于Linux的在进程活动停止后就结束了该进程。Android把这些进程都保留在内存中,直到系统需要更多的内存为止。这些保留在内存中的进程通常情况下不会影响整体系统的运行速度,并且当用户再次激活这些进程时,提升了进程的启动速度。

那Android什么时候结束进程?结束哪个进程?

1 系统会对进程的重要性进行评估,并将重要性oom_adj这个数值表示出来,赋予各个进程;

       -------系统会根据oom_adj来判断需要结束哪些进程,一般来说,oom_adj的值越大,该进程被系统选中终止的可能性就越高

2 前台程序的oom_adj值为0,这意味着他不会被系统终止,一旦它不可访问后,会获得个更高的oom_adj,该值可能是根据LRU列表中的位置所决定的

3 Android不同于Linux,有一套自己独特的进程管理模块,这个模块有更强的可定制型,可根据oom_adj值的范围来决定进程管理策略。

五 Android将进程分为六大类:

(1) 前台进程:目前在屏幕上显示的进程和一些系统进程。

(2) 可见进程:可见进程是一血不在前台,当用户依然可见的进程。例如输入法等,这部分虽然不在前台,但与我们的使用密切相关,也不希望他们被终止。

(3) 次要服务:目前正在运行的一些服务。和一些系统功能依然息息相关。

(4) 后台进程:就是我们通常意义上理解的启动后被切换到后台的进程,比如浏览器等。当程序显示在屏幕上,它所运行的进程即为前台进程。一旦我们按home返回主界面,程序驻留在后台,称为后台进程。

(5) 内容供应结点:没有程序实体,进行提供内存给别的进程去用,比如日历供应结点,邮件供应节点等。

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

 

实践

说完理论,说些实践的东西,怎样管理这六类进程,如何来设置进程管理模块是这部分说的内容。

首先是软件,推荐使用MinFreeManager,市场上就有下载,用于设置这六类进程的管理策略。

软件运行后有六个输入框,在输入框中只能输入数字,这些数字代表了这类进程的处理策略,比如Foreground App下的输入框显示6,就表示,当可用内存低于6MB时,终止Foreground App。下面的类似,如Empty App下的输入框显示24,则表示,当内存低于24MB时,终止Empty App。

从软件数值的设置不难看出结束进程的有限顺序:Empty>Content Provider>Hidden>Secondary Server>Visible>Foreground。

 

posted @ 2015-06-11 18:04  大大的海棠湾  阅读(248)  评论(0)    收藏  举报