【发布时间】:2019-07-17 11:33:48
【问题描述】:
我正在尝试模拟 Linux 中进程的错误场景,即堆不足以在 C++ Linux 应用程序中分配内存。 但是即使我使用“setrlimit”来减少进程可用的堆内存,堆内存仍然被成功分配。
struct rlimit the_limit = { 1, 1 };
if (-1 == setrlimit(RLIMIT_DATA, &the_limit)) {
perror("setrlimit failed");
}
try
{
char *n = new char[5600];
if (n==NULL)
{
cout <<"\nAllocation Failure\n";
}
}
catch (std::bad_alloc& ba)
{
std::cerr << "bad_alloc caught: " << ba.what() << '\n';
}
【问题讨论】:
-
Linux 很乐意overcommit(也就是说,允许程序分配超过可用资源)。这是因为内存不会映射到进程,除非它们被实际使用(读取或写入),并且多个进程同时需要它们的所有页面是不常见的。
-
另外,
RLIMIT_DATA并不代表您认为的意思,这在副本中有解释。 -
@Someprogrammerdude 这可能不是原因。在这种情况下,我认为问题更可能与使用 C++ 的代码有关。请问可以重新打开吗?
-
@PSkocik
new将使用malloc(在相对现代的 Linux 上)将使用mmap。并且RLIMIT_DATA不会更改mmap使用的限制,如副本中所述。 -
@Someprogrammerdude
setrlimit手册页说RLIMIT_DATA确实适用于自 Linux 4.7 以来的mmap。 C++ 示例的问题似乎是 C++ 标准库在启动时预分配了一些堆,然后使用预分配的堆来满足小的 5600B 请求。增加请求大小(在我的系统上,至少为 1setrlimit 问题与 C 对应的问题不同。
标签: c++ linux heap-memory