android内存自动清理机制和android垃圾回收器

来源:互联网 发布:象棋软件下载 编辑:程序博客网 时间:2024/05/16 06:58
首先要明白android基于linux系统,系统的内存使用规则是不一样的。
windows下的内存管理规则为:退出即销毁,程序的内存会被回收。
linux的内存认为不用白不用,在程序退出后,如果没有新的内存申请,则内存不会被释放,这样下一次运行的时候会提高响应速度。
如此,android设计了low_memory和OUT_OF_MEMORY机制。
low_memory是在程序申请内存的时候报警,然后可以对这个报警进行一些响应,比如释放不用的资源来防止崩溃之类的。在低内存机器中,观察launcher在机器刚开机和运行一段时间后所占内存的大小就能发现,开机的时候内存占用很大,但是随着应用越开越多,占用内存在一步步被释放。
而OOM机制是机器底层的一种强制保鲜,在OOM发生的时候内核会排序强制杀掉进程来保证系统的继续运行,同样这种OOM异常容易发生在低内存机器上,比如512M。
首先系统会根据程序是否是空进程(已经由用户关闭的不带有任何服务和provider的进程),是否有服务,是否有provider,是否为前台进程,来排序,可以输入 adb shell dumpsys meminfo来查看,列出信息中的Total PSS by OOM adjustment:就是系统为程序的OOM排序结果,OOM异常的时候会根据这个表单从下网上杀掉进程释放内存。
OOM的阈值:是机器判定发生OOM的规则,在/kernel/drivers/staging/android/lowmemorykiller.c中可以看到

lowmem_adj[6] 为OOM等级,lowmem_minfree[6]为对应的在系统内存低于多少的时候,adj中高于该等级的活动都要被强制释放。对应的可以修改阈值,完成后编译lk就可以了。


Android 是一个多任务系统,就是说可以同时运行多个程序,这个大家应该很熟悉。一般来说,启动运行一个程序是有一定的时间开销的,因此为了加快运行速度,当你退出一个程序时,Android并不会立即杀掉它,这样下次再运行该程序时,可以很快的启动。随着系统中保留的程序越来越多,内存肯定会出现不足,这个时候Android系统开始自动清除一些程序

  Android系统中杀程序的这个机制是 "LowMemory Killer",它是在Linux内核中实现的。这里它实现了一个机制,由程序的重要性来决定。Android将程序的重要性分成以下几类,按照重要性依次降低的顺序:

名称oom_adj解释FOREGROUD_APP0前台程序,可以理解为你正在使用的程序VISIBLE_APP1用户可见的程序SECONDARY_SERVER2后台服务,比如说QQ会在后台运行服务HOME_APP4HOME,就是主界面HIDDEN_APP7被隐藏的程序CONTENT_PROVIDER14内容提供者,EMPTY_APP
15
空程序,既不提供服务,也不提供内容
其中每个程序都会有一个oom_adj值,这个值越小,程序越重要,被杀的可能性越低。

  除了上述程序重要性分类之外,Android系统还维护着另外一张表,这张表是一个对应关系,以N1为例:


oom_adj内存警戒值( 以4K为单位)
01536120482409675120145632156144
这个表是定义了一个对应关系,每一个警戒值对应了一个重要性值,当系统的可用内存低于某个警戒值时,就杀掉所有大于该警戒值对应的重要性值的程序。比如说,当可用内存小于6144 * 4K = 24MB时,开始杀所有的EMPTY_APP,当可用内存小于5632 * 4K = 22MB时,开始杀所有
的CONTENT_PROVIDER和EMPTY_APP。

  alter minfree改的是什么呢,上面这张对应表是由两个文件组成的:
/sys/module/lowmemorykiller/parameters/adj和/sys/module/lowmemorykiller/parameters/minfree。

alter minfreee就是修改/sys/module/lowmemorykiller/parameters/minfree这个文件的,举例来说,如果把最后一项改为32 * 1024,那么当可用内存小于128MB是,就开始杀所有的EMPTY_APP。

0 1
原创粉丝点击