【问题标题】:how to catch out of memory exception on ubuntu [duplicate]如何在ubuntu上捕获内存不足异常[重复]
【发布时间】:2014-07-03 20:33:27
【问题描述】:

我正在尝试通过以下函数捕获内存不足异常:

void allocMemory(buffer& thebuf, size_t size)
{
try
{
         thebuf = buffer(size); // new char[] here
}
catch(bad_alloc& ex)
{
     exception handling... // print some information
         exit(1);
}
}

处理应该显示一些信息并关闭程序。这在 Windows 上工作正常,但在 Linux 上,程序只是直接在终端上用“Killed”关闭。似乎 OOM 杀手在捕获异常之前杀死了我的程序。

这正常吗?

如何在 Linux 上捕获内存不足异常?

附:我在 ubuntu 12.04 64 位上进行测试,仅使用 4GB 内存进行测试,没有交换空间,语言是 C++。此外,如果我一次新建大量内存,该功能确实可以在 Linux 上运行。但是,如果我每次都更新一点(例如:在一个循环中),程序最终将在终端上以“Killed”关闭

任何帮助将不胜感激。

【问题讨论】:

    标签: c++ exception out-of-memory ubuntu-12.04


    【解决方案1】:

    在 Linux 上,您不会得到任何 bad_alloc 异常(除非您更改 shell 中的某些默认值)。

    Linux 使用惰性分配策略。任何分配请求(当不是太大时)都会成功。操作系统将返回一个未映射到虚拟内存的地址。映射发生在程序实际尝试使用内存时。只有此时才能检测到内存不足的情况。

    但是,当发生这种情况时,再向程序报告情况已经太晚了。它不准备处理它。所以操作系统直接杀死程序。

    Google linux out of memory killer 获取(大量)更多信息。

    您可以使用rlimit 命令限制程序可用的内存量。将其设置得足够低,以便程序在耗尽所有可用内存之前达到限制。

    如果需要,您还可以在系统范围内禁用惰性分配行为,但这很少是一件好事。

    【讨论】:

    • 解释很清楚,所以在Linux上用异常捕获OOM错误似乎是不可能的。我想做的是在OOM发生时给用户一个反馈并顺利关闭程序,在Linux上有没有好的方法?
    • 进程被一个无法捕获的信号杀死,所以你能做的最好的就是启动另一个充当看门狗的小进程。
    【解决方案2】:

    您可以将 Linux 配置为不过度使用内存。

    过度使用通常是一件好事。机票也超卖,有时会导致飞机超额预订,他们可能需要更改某人的航班。但一般不会发生这种情况。这同样适用于从 Linux 请求内存的应用程序。就像我说的,您可以将 Linux 配置为不过度使用内存。

    另见this question

    【讨论】:

    • 感谢您的链接。但是由于我们的用户可能没有root权限,所以可能无法要求他们配置Linux,有没有更好的方法来检测Linux上的内存不足?
    【解决方案3】:

    你想要这样的东西:

    try {
        thebuf = new buffer[size];
    } catch(std::bad_alloc& ex) {
        std::cout << ex.what();
        exit(1);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-06
      • 2013-12-09
      • 2016-04-21
      • 2015-05-31
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多