Linux:关于OOM Killer机制所产生问题的分析

在Linux虚拟机上编译Android代码时,出现编译进程被杀死的现象,随后在/ var / log / messages文件中查看到如下图所示的错误消息:

在这里插入图片描述

total-vm、rss、anon-rss、file-rss

total-vm: 进程使用的虚拟内存大小

rss: 一种衡量Linux中进程使用的内存量的方法。total-vm中的一部分内存实际上已经被映射到了系统RAM区来供其分配或使用(或已分配和使用)

anon-rss: 即匿名内存。分配在实际内存块中的那部分rss(除了映射到文件或设备的)

file-rss: 映射到设备和文件得 rss内存块

基于此上情况分析:

  1. 如果在vim中打开一个很大的文件,file-rss会变得很大
  2. 如果使用malloc()、new来申请大量内存并使用,那么anon-rss将会变得很大
  3. 如果使用malloc()、new分配了大量的空间却没有使用,那么total-vm将会变得更高,但是由于这样不会真正使用内存,所以 rss会很低

overcommit

overcommit_memory是一个内核对内存分配的一种策略,它有三个可选值:0、1、2。
在Linux中可通过cat /proc/sys/vm/overcommit_memory查看当前配置的数值,如下图:
在这里插入图片描述
其中:
0表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1表示内核允许分配所有的物理内存,而不管当前的内存状态是否满足需求。
2表示内核允许分配超过所有物理内存和交换空间总和的内存。

Linux的这种内存分配策略,在申请的时候是不会分配物理内存,只有在真正使用的时候才会分配,为了尽可能的提高内存利用率,系统大部分情况下都会“答应”申请内存的要求。但是由于overcommit,系统不会在进程运行的时候就预判内存是否会耗尽,只有在真正分配并使用内存的时候才会知道内存不够,为了防止系统崩溃,此时OOM killer就会杀死一个或者几个优先级低的进程。

解决方法

设置相关文件的参数:
/proc/< pid >/oom_adj : 可选-16至15,默认是0。设置为-17表示永远不会被杀死,值越大越容易被杀死
/proc/< pid >/oom_score: 根据oom_score计算一个值,根据计算出的值来选择哪些进程先被杀死
/proc/sys/vm/overcommit_memory: 将overcommit参数设置为0,当系统分配不出内存时就会返回错误,不会触发OOM Killer

你可能感兴趣的:(Linux)