gpt4 book ai didi

c++ - 最大 LImit of ram +swap 内存的异常处理

转载 作者:行者123 更新时间:2023-11-28 07:38:04 25 4
gpt4 key购买 nike

我写了一个在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 区域的内存分配时,内存分配发生在交换内存中。当交换内存已满时,操作系统会终止程序。我应该使用哪种类型的执行处理,使我的程序填满可用内存,因此不会被操作系统杀死。

最佳答案

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

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

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

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

关于c++ - 最大 LImit of ram +swap 内存的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16357083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com