小编Gar*_*han的帖子

当大量内存显然空闲时,进程被 OOM 杀手杀死

我正在开发基于 ARM 的嵌入式平台。32 位,512MB RAM,无交换。Linux 3.10.53(某些种类的 Ubuntu,如果相关的话)。

我正在处理的一些代码一直被 oom 杀死,尽管我实际测量的所有内容都表明它死后有足够的内存可用。这可能是什么原因造成的?

在运行进程之前, free -m 报告了大约 320MB free,这也接近 /proc/meminfo 中的 LowFree 数字;来自 ps -e -o vsize 的所有数字的总和约为 212MB,/proc/meminfo 中的平板数字约为 10MB,这表明不应使用超过约 222MB,这与空闲内存。

然后我运行我的代码,一段时间后它被 oom 杀死了。dmesg 中的注释说该进程的总大小为 180MB;请注意,这远小于运行它之前应该免费的 300MB 左右。正是这个进程自己的内存请求触发了 oom-killer。

(这绝对是杀死进程的 oom-killer;它在 dmesg 中说了这么多,而我的 ulimits 是无限的。)

一个简单的程序

我发现我可以使用绝对微不足道的程序重现我不理解的关键内容。我将描述它,然后(以防有人关心)返回到最初发送给我的更复杂的程序,我已经对其进行了更广泛的测试。

所以,这里有一些代码。无聊的#includes 省略。普通的 C.

int main(void) {
  int i=0, j;
  char * p;
  while (1) {
    fprintf(stderr, "allocating block %d\n", ++i);
    p = malloc(10000000);
    for (j=0; j<10000000; ++j) p[j] = j; …
Run Code Online (Sandbox Code Playgroud)

memory out-of-memory

6
推荐指数
0
解决办法
1747
查看次数

标签 统计

memory ×1

out-of-memory ×1