2013-05-03 46 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”并重新启动,这不是一个更好的选择[除非你真的试图造成系统崩溃,但我希望你不是真的想要这样做]。 正如@斯蒂芬所说,您可能要求解决与“真正”问题不同的问题,这意味着我的答案可能对您有帮助。