.net
Windows环境要求非常类似的问题:
你如何保护自己免受内存消耗失控打破个人电脑?
这个问题是针对使用C或C ++的Unix环境提出的。 举一个例子,考虑下面的危险小块:
#include <vector> int main() { int n; std::vector<double> A(n); }
如果幸运的话,代码将会引发一个范围错误。 如果你不幸(在我的情况下,内存的价值是283740392),代码将快速使用所有可用的RAM,并导致大规模的交换到磁盘,使操作系统虚拟停顿更快,然后可以被杀死。 当然,这个进程总是可以被终止,但是可能需要几分钟的时间才能恢复,因为所有其他正在运行的进程都必须重新加载到内存中。 这不是一个问题的答案意味着缺乏内存,人们可以很容易地让一个失控的过程,沼泽任何可用的机器。
正如在注释中所建议的那样,在启动程序之前要么ulimit -v <size>
,要么在程序中使用setrlimit
。
你正在寻找setrlimit电话。 先前。
在linux中有一个叫做“OOM杀手”的东西。 它会根据内存使用情况和CPU使用情况来杀死进程。
一个可能更好,但更复杂的答案(比ulimit)将是一个自定义分配器,这限制了任何给定分配的最大大小(100MB左右),但不限制允许使用的总内存。