2011-11-03 74 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?