伙伴系统无法分配内存时,会通过OOM函数直接kill线程来回收内存.
快速分配->慢速分配->kswap内存回收->内存规整->直接内存回收->out_of_memory
__alloc_pages_nodemask->__alloc_pages_slowpath->__alloc_pages_direct_compact
->__alloc_pages_direct_reclaim
->__alloc_pages_may_oom->out_of_memory
进程得分相关参数,每个进程独有
参数名称 含义
oom_score 进程oom_badness计算得分,为只读参数。
oom_score_adj 计算进程得分时的调整值。取值范围是-1000~1000,0表示不调整得分,负值表示在实际打分值上减去一个折扣,正值表示要惩罚该进程增加得分。
oom_adj 旧的计算进程得分时的调整值,实际使用时会转换为oom_score_adj。
oom_score_adj取值范围-1000-1000
每个进程的得分 oom_score = (进程占用内存*1000)/(系统总内存) + oom_score_adj ,计算函数oom_badness
可以看出oom_score_adj越大,进程得分越高,越容易被选择回收.
oom_adj是兼容以前的API接口. oom_score_adj = (oom_adj*1000)/(17) oom_adj取值范围(-17,15)
android系统实现了lowmemorykill驱动,实现原理跟Linux的OOM类似,也是选择oom_score_adj最大的进行kill .
通过注册register_shrinker(&lowmem_shrinker)来实现,当进行内存回收时,调用堆栈:
shrink_zone->shrink_slab回调