所以我了解到在 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() 返回的指针。