Linux上的C程序耗尽内存

Mar*_*ark 19 c linux memory-management

我想编写一个程序来消耗所有可用的内存来理解结果.我听说linux一旦无法分配内存就开始查杀进程.

任何人都可以帮我这样的程序.

我写了以下内容,但内存似乎没有用尽:

#include <stdlib.h>

int main()
{
        while(1)
        {
                malloc(1024*1024);
        }
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

nos*_*nos 13

您应该写入已分配的块.如果你只是要求内存,linux可能只是分配内存预留,但在访问内存之前不会分配任何内容.

int main()
{
        while(1)
        {
                void *m = malloc(1024*1024);
                memset(m,0,1024*1024);
        }
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

你真的只需要在每个页面上写1个字节(通常在x86上为4096个字节).

  • 换句话说,给定http://www.youtube.com/watch?v=A7uvttu8ct0,您的程序是Jerry,Linux是汽车租赁服务的女性. (4认同)

Zac*_*sch 10

Linux"过度提交"内存.这意味着物理内存仅在进程首次尝试访问进程时提供给进程,而不是malloc首次执行时进行.要禁用此行为,请执行以下操作(以root身份):

echo 2 > /proc/sys/vm/overcommit_memory
Run Code Online (Sandbox Code Playgroud)

然后尝试运行您的程序.


小智 5

默认情况下,Linux 使用我喜欢称之为“机会分配”的东西。这是基于观察到许多实际程序分配的内存比实际使用的多。Linux 使用它来将更多的东西放入内存:它只在使用时分配内存页,而不是在使用 malloc(或 mmap 或 sbrk)分配时。

如果你在循环中做这样的事情,你可能会取得更大的成功:

memset(malloc(1024*1024L), 'w', 1024*1024L);
Run Code Online (Sandbox Code Playgroud)