0

我写了一个在 centOS 下运行的 prog。我的 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;
}

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

4

1 回答 1

1

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

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

然而,有时系统会在内存不足的情况下完全运行,并且系统可以保持活动状态的唯一方法(这比崩溃和重新启动系统更好)是杀死一些进程。它有一些关于杀死什么的“规则”——基本上,首先查看使用大量内存的进程,其中最近增长最快的进程首先被杀死。由于您的进程可能很好地满足了该标准,因此它很可能会被杀死,并且由于它使用了大量内存,因此无需更进一步。

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

于 2013-05-03T10:58:42.510 回答