2011-11-03 72 views
3

如何更改程序的最大RAM内存量?我经常耗尽内存(不是系统最大值,最大值),我不希望更改全局内存限制。我环顾四周,看到vlimit()函数可能工作,但我不确定如何使用它。C++更改最大RAM限制

编辑:我在Linux 2.6.38-11-通用 这不是内存泄漏,我从字面上必须分配100k给定的类,没有办法绕过它。

+0

您需要指定到底是什么限制,然后才能开始猜测如何解除限制 – sehe

+0

以及哪个版本的UNIX? – trojanfoe

+0

2.6.38-11-generic linux – Precursor

回答

2

如果这些限制是由系统管理员强加给您的,那么不会 - 您卡住了。如果你是自己,确定 - 只要提高软硬限度即可。

正如Chris在评论中指出的那样,如果你是一个特权进程,你可以使用setrlimit来提高你的硬性限制。然而,假设你是否在ulimit之下,那么你不可能是一个特权进程。

+0

那么,我是系统管理员。但事实是,我并不想在Linux上使用ulimit命令来全局更改它。有什么办法可以从代码中做到这一点? – Precursor

+0

只能在单个shell中使用'ulimit'命令,即在单个终端中。 –

+4

你可以通过一个没有限制的shell来启动。但是没有用户级的API可以绕过它(如果任何不想被限制的应用程序都可以“退出”,那么它就没有用处)。 –

2

你明白吗你为什么要达到内存限制?你确定你没有内存泄漏(如果你有泄漏,你需要更长时间运行你的应用程序越来越多的RAM)。

假设一台Linux机器,您可能会使用valgrind来搜索和调试内存泄漏,您也可以使用Boehm's conservative garbage collector来避免它们。

+0

这不是内存泄漏。我必须分配大约100,000个类的实例,因此我的内存不足。 – Precursor

+0

然后解决办法是购买更多的RAM(今天便宜),或者减少实例的数量,或者减小每个实例的大小。 –

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 
    } 
} 
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 
} 

如果由于某种原因,你真的想要一个更大的堆栈,请参考相应的标志编译器的文档:

How to increase the gcc executable stack size?

Can you set the size of the call stack in c++? (vs2008)

你可能要考虑:

When do you worry about stack size?