对ram + swap内存的最大LImit进行异常处理

时间:2013-05-03 10:46:18

标签: c++ memory-management data-structures

我写了一个在centOS下运行的编程。我的ram + swap内存为16 GB。

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

我的问题是当prog运行并越过RAM区域的内存分配时,内存分配发生在交换内存中。当交换内存已满时,操作系统会终止前卫。我应该使用什么类型的execption处理,这使得我的程序可以填充可用的内存,因此不会被操作系统杀死。

1 个答案:

答案 0 :(得分:1)

简单的答案是“当没有足够的可用内容时,不要编写使用大量内存的代码”,但如果你真的需要大量的内存,这当然要比实际编写容易得多。码。

您遇到的问题称为“内存过量使用”和“OOM杀手”。内存过量使用是您的应用程序要求内存不存在的情况。有点像航空公司在航班上出售一些额外的座位,期望一些乘客(统计上)不会出现。以类似的方式,当您的应用程序(或任何其他应用程序)请求内存时,操作系统假定它们实际上不需要所有请求的内存,因此它允许分配比实际可用内存更多的内存。

然而,有时系统会完全运行内存,系统可以保持活动的唯一方法(这是比崩溃和重启系统更好的选择)是通过杀死一些进程。它有一些关于杀人的“规则” - 基本上,首先看看使用大量内存的进程,其中,最近一直在增长的进程​​首先被杀死。由于你的过程可能很好地满足了这个标准,很可能是被杀死的那个,并且因为它使用了大量的内存,所以没有必要更进一步。

你真的没有办法阻止这种情况发生。您可以在没有OOM杀手的情况下重新配置内核,但很可能您的系统将“OOPS”并重新启动,这不是更好的选择[除非您实际上试图导致系统崩溃,但我希望您不是真的想要这样做]。 正如@Stefan所说,你可能要求解决与“真实”问题不同的问题,这意味着我的回答可能是对你有帮助的。