使用 ulimit 设置进程的最大内存限制

使用 ulimit 设置进程的最大内存限制

所以我了解到在 C 中很容易造成内存泄漏:

#include <stdio.h>
void main() {
    int* p;
    int i=0;
    
    p=(int*)malloc(sizeof(int));
    while (p!=NULL) {
        p=(int*)malloc(sizeof(int));
        i++;
    }
    printf("malloc failed after %d allocations\n",i);
}

我想看看如何避免每次启动该程序时都重新启动计算机(或者在为时已晚之前将其杀死)。

ulimit似乎是解决方案。ulimit -S -m 1000000应该防止任何进程占用超过 1000000 kbyte / 1gbyte 的内存(我有 32gbyte 的 RAM)。但它似乎完全没有效果:当我启动上面的程序时,如果我不杀死它,它将使用所有内存。

我尝试设置一个非常低的限制(100 kbyte ...),或设置虚拟内存限制(-v)而不是 RSS 但没有看到任何效果...

我错过了什么?

答案1

ulimit -m限制了常驻集大小进程的数量——即一次可以调入进程的多少部分。

如果有可用的交换空间,进程的虚拟内存可能会大得多。

ulimit -v限制可以分配的虚拟内存量,这就是您想要的。请注意,它不一定由子进程继承,因此请使用子 shell 和exec

( ulimit -v 1000000 && exec test_program )

答案2

Ram(在大多数 Unix 系统上)是在第一次写入时延迟分配的。您不会写入从 malloc() 返回的指针。

相关内容