2013-05-03 13 views
0

我已經寫了一個程序運行在centOS下。我的內存+交換內存是16 GB。異常處理最大LIAM的RAM +交換內存

#include <iostream> 
#include <list> 
#include<cstdlib> 
#include<new> 
#include <exception> 

using namespace std; 
int main() 
{ 
    std::list<double> mylist; 

    double i; 
    try{ 
    for (double i=1; i<=250000000; ++i) mylist.push_back(i); 
    } 
    catch (std::bad_exception& ba) { 
     cout << "Allocation failure: " << ba.what() << endl; 
    mylist.clear(); 
     exit(1); 
    } 
    mylist.clear(); 

// std::cout << "mylist contains:"; 
// for (it=mylist.begin(); it!=mylist.end(); ++it) 
// std::cout << ' ' << *it; 
// std::cout << '\n'; 

    return 0; 
} 

我的問題是當程序運行並越過RAM區域的內存分配,然後內存分配發生在交換內存。當交換內存已滿時,操作系統殺死編程。我應該使用哪種類型的執行處理,這使我的程序能夠充滿可用內存,因此不會被操作系統所殺。

+1

XY問題?爲什麼你需要用完所有的記憶? – stefan 2013-05-03 10:51:22

+0

注意:如果你的系統只剩下很少的空閒內存,異常處理本身可能不起作用,因爲「異常對象的內存以未指定的方式分配」[except.throw]/4。內存頁的堆棧通常只會在必要時被提交(另一個可能的問題),所以我認爲最好的辦法不是試圖佔用所有的內存。分配大塊也可能有幫助。 – dyp 2013-05-03 11:25:16

回答

1

簡單的答案是「不要編寫代碼,當沒有足夠的可用空間時使用大量內存」,但這當然比寫實際實現更容易,如果實際上需要大量內存你的代碼。

你看到的問題叫做「內存過量使用」和「OOM殺手」。內存過量使用是您的應用程序詢問並不存在的內存的一種情況。有點像航空公司在飛機上出售一些額外的座位,期望有些乘客(統計上)不出現。以類似的方式,當應用程序(或任何其他應用程序)請求內存時,操作系統假定它們實際上並不需要完全滿足所有請求的內存,因此它允許分配更多的內存而不是實際可用的內存。

然而,有時系統會在內存不足的情況下運行,系統可以保持活動的唯一方式(這比碰撞和重新啓動系統更好)是通過殺死某個進程。它有一些關於要殺的東西的「規則」 - 基本上,首先看看使用大量內存的進程,其中最近發展最快的進程首先被殺死。由於你的過程可能很好地滿足了這個標準,因此它很可能是被殺的人,並且由於它使用了大量的內存,所以沒有必要走得更遠。

確實沒有太多的事情可以阻止這種情況的發生。你可以在沒有OOM殺手的情況下重新配置你的內核,但是很可能你的系統會「OOPS」並重新啓動,這不是一個更好的選擇[除非你真的試圖造成系統崩潰,但我希望你不是真的想要這樣做]。 正如@斯蒂芬所說,您可能要求解決與「真正」問題不同的問題,這意味着我的答案可能對您有幫助。