ram +交换内存最大限制的异常处理
Exception handling for maximum LImit of ram +swap memory
我写了一个在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所说,你可能在寻求一个不同于"真正"问题的解决方案,这意味着我的答案可能对你有帮助。
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Firebase C++VS2018 SDL2-在Firebase::app::create(..)上执行异常处理
- 使用 stoi 功能进行异常处理
- 子系统中的异常处理:本机
- 与异常处理程序中的操作员<<不匹配
- 数组 C++ 上的异常处理程序
- 异常处理:如果用户输入不是三个特定字符之一
- C++ 异常处理错误输出
- 视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc
- C++交换机状态异常处理
- 在字符串类上的成员函数和out_of_range异常处理
- 奇怪的消息 (_Base_bitset::_M_do_to_ulong) 从溢出异常处理程序中打印出来
- 执行视觉工作室异常处理模式
- 为什么隐式转换在异常处理中从派生到基?
- C++执行期间的类成员函数错误/异常处理
- C++ 中未处理的异常处理程序
- 用户定义的异常处理
- C :ScopeGuard vs返回支票和异常处理
- ram +交换内存最大限制的异常处理