伙伴系统无法分配内存时,会通过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回调
本文深入探讨了Linux系统中伙伴系统内存分配失败后的OOM机制,包括快速分配、慢速分配、kswap内存回收等步骤,详细解析了进程得分oom_score的计算方法及参数oom_score_adj的作用,同时介绍了Android系统的lowmemorykill驱动实现原理。
2941





