そのため、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
これにより、プロセスが1000000kbyte / 1gbyte以上のメモリを占有するのを防ぎます(RAMは32gbyteです)。しかし、まったく効果がないようです。上記のプログラムの起動時にプログラムを終了しない場合は、すべてのメモリを使用してください。
非常に低い制限(100kbyte ...)を設定したり、-v
RSSの代わりに仮想メモリ制限()を設定してみましたが、何の効果もありませんでした...
私が逃したものは何ですか?
答え1
ulimit -m
限られた常駐セットサイズプロセス数 - つまり、一度に呼び出すことができるプロセス部分の数。
スワップ領域が利用可能な場合、プロセスの仮想メモリがはるかに大きくなる可能性があります。
ulimit -v
割り当てることができる仮想メモリの量を制限します。これがまさに欲しいものです。必ずしも子プロセスによって継承されるわけではないので、サブシェルを使用して次のようにしますexec
。
( ulimit -v 1000000 && exec test_program )
答え2
Ram(ほとんどのUnixシステムでは)は、最初の書き込み時に遅延割り当てられます。 malloc() から返されたポインタには書き込みません。