ram +交换内存最大限制的异常处理

Exception handling for maximum LImit of ram +swap memory

本文关键字:异常处理 交换 内存 ram      更新时间:2023-10-16

我写了一个在centOS下运行的程序。我的ram +交换内存是16gb。

 #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区域的内存分配时,内存分配发生在交换内存中。当交换内存已满时,操作系统将终止该程序。我应该使用什么类型的异常处理,使我的程序填满可用内存,从而不被操作系统杀死。

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

你所看到的问题被称为"内存过度提交"answers"OOM-killer"。内存过度提交是指应用程序请求的内存实际上并不存在。这有点像航空公司在航班上出售一些额外的座位,期望一些乘客(统计上)不会出现。类似地,当您的应用程序(或任何其他应用程序)请求内存时,操作系统假定它们实际上不需要所有请求的内存,因此它允许分配比实际可用内存更多的内存。

然而,有时候,系统会完全耗尽内存,而唯一能让系统保持存活的方法(这比崩溃和重新启动系统要好)就是杀死一些进程。它有一些关于杀死什么的"规则"——基本上,首先查看使用大量内存的进程,在这些进程中,最近增长最快的进程首先被杀死。由于您的进程可能很好地满足了这些条件,因此它很可能是被终止的进程,并且由于它使用了大量内存,因此不需要进一步操作。

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