3

如何更改程序的最大 RAM 量?我经常耗尽内存(不是系统最大值,ulimit max),我不想更改全局内存限制。我环顾四周,发现 vlimit() 函数可能有效,但我不确定如何使用它。

编辑:我在 linux 2.6.38-11-generic 这不是内存泄漏,我实际上必须分配给定类的 100k,没有办法解决。

4

4 回答 4

3

您是否在堆栈上分配对象并且实际上达到了堆栈限制?

例如,您是否写过这样的内容:

void SomeFunction() {
    MyObject aobject[100000];
    // do something with myobject
}

该数组将在堆栈上分配。一个更好的解决方案——为你自动分配堆——是写

void SomeFunction() {
    std::vector<MyObject> veccobject(100000); // 100.000 default constructed objects
    // do something with myobject
}

如果出于某种原因,您真的想要更大的堆栈,请查阅您的编译器文档以获取适当的标志:

如何增加 gcc 可执行堆栈大小?

你可以在 C++ 中设置调用堆栈的大小吗?(vs2008)

您可能需要考虑:

你什么时候担心堆栈大小?

于 2011-11-03T16:06:18.563 回答
2

Do you understand why you are hitting the RAM limit? Are you sure that you don't have memory leaks (if you do have leaks, you'll need more and more RAM when running your application for a longer time).

Assuming a Linux machine, you might use valgrind to hunt and debug memory leaks, and you could also use Boehm's conservative garbage collector to often avoid them.

于 2011-11-03T15:44:57.520 回答
2

如果系统管理员对您施加了这些限制,那么不,您被卡住了。如果你是ulimit自己,当然——只要提高软硬限制。

正如克里斯在评论中指出的那样,如果您是特权进程,则可以使用setrlimit来提高进程中的硬限制。但是,有人假设如果您处于 a 之下ulimit,那么您不太可能成为特权进程。

于 2011-11-03T15:40:08.977 回答
1

如果您有权限,您可以使用setrlimit调用(取代 vlimit)在程序开始时设置限制。这只会影响该程序及其后代。

#include <sys/time.h>
#include <sys/resource.h>

int main() {
  struct rlimit limit;
  limit.rlim_cur = RLIM_INFINITY;
  limit.rlim_max = RLIM_INFINITY;
  if (0 != setrlimit(RLIMIT_AS, &limit)) {
  //errro
  } 
} 
于 2011-11-03T15:57:25.180 回答