今天面试的时候被问到android的内存管理机制,答上来了但是语言组织有问题,从网上摘了资料,组织组织。
Linux的空闲内存通常都很少,这是因为无论物理内存有多大,linux都将其充分利用了。把程序调用过的硬盘里的数据放到内存,利用内存读写的高速特性来提高linux系统的数据访问性能。而windows是只有在需要内存的时候 才会给应用程序分配内存。也就是说,我们给电脑装上了一块内存,linux能有效的把这块内存进行利用,但是windows如果之前的内存足够,就不会利用这块内存。
Android上java编写的应用,一个应用进程对应一个DVM虚拟机进程。也就是说,打开一个应用就会打开一个虚拟机进程。这么做的好处是:即使一个应用程序fc了,也不会波及到整个系统。但是这样做有个非常大的问题,就是打开一个独立的虚拟机需要消耗更多的内存。
Android系统打开占用内存比较大的程序,或者打开了好几个程序,会显得非常卡,那是因为android可用内存低于定义的某个阀值时,会触发进程调度调度策略,这是一项十分消耗系统资源的操作。这种情况下,android不会把所有进程占用的内存都释放,而是选择性的释放,通过系统对进程重要性的评估,越重要的越不会释放,反之,不重要的首先释放,
Android进程分为六大类,下面类表按照重要度从大到小排列,排在最底下的进程在内存不足时优先释放:
1.前台进程(foreground):与用户正在交互的活动,与用户正在交互的活动绑定的服务,broadcastReceiver正在执行onreceiver()方法,以及一些系统进程比如google search.
2.可视进程(visible):一些不在前台,但是用户依然可见的进程,比如widegt, 输入法,时钟。你肯定不希望每次点击Edittext的时候 都重启一次输入法,或者每次查看时钟的时候,时钟才走动。
3.服务进程(service process)运行着通过startservice或者bindservice启动的服务,没有直接与用户交互,但是他执行的是用户关心的事,比如播放歌曲,或者从网络上下载数据、
4.后台进程(background process)与用户交互的活动 按下home键之后就变成了后台进程(已经调用了onstop方法)。一般有很多后台进程运行着,他们保持在一个LRU(least recently used)类表中,最经常使用的最后销毁,不经常使用的最先销毁。
5.空进程(empty process)与用户交互的活动按下返回键退出的时候,成为一个空进程。这个进程里没有任何数据在运行。这么做的目的是 保持一个cache,以便下次启动的时候提高启动效率或者保留一些历史信息。