【问题标题】:Unix - Protect yourself from runaway memory consumption bringing down the PC?Unix - 保护自己免受导致 PC 崩溃的内存消耗失控?
【发布时间】:2011-10-28 15:36:55
【问题描述】:

针对.net Windows 环境提出了一个非常相似的问题:

How do you protect yourself from runaway memory consumption bringing down the PC?

这个问题是针对使用 C 或 C++ 的 Unix 环境提出的。例如,考虑下面的危险小块:

#include <vector>
int main() {
  int n;
  std::vector<double> A(n);
}

如果幸运的话,代码会抛出一个范围错误。如果您不走运(在我的情况下,内存中 a 的值是 283740392),代码将迅速使用所有可用的 RAM 并导致大量交换到磁盘,从而更快地将操作系统磨碎到虚拟停止状态,然后它可能会被杀死。当然,该进程总是可以最终被杀死,但通常可能需要几分钟才能恢复,因为所有其他正在运行的进程都必须重新加载到内存中。这不是一个问题,其答案意味着缺少 RAM,很容易给出一个失控的进程,淹没任何可用的机器。

【问题讨论】:

  • 运行ulimit -v &lt;some_limit&gt;怎么样?

标签: c++ c linux unix memory-management


【解决方案1】:

正如评论中所建议的那样,在您开始您的程序之前ulimit -v &lt;size&gt;,或者在其中以编程方式setrlimit

【讨论】:

    【解决方案2】:

    您正在寻找setrlimit 电话。 Previously.

    【讨论】:

      【解决方案3】:

      在 linux 中有一个叫做 'the OOM killer' 的东西。它会根据内存使用情况和 CPU 使用历史记录杀死进程。

      【讨论】:

      • 你真的不希望事情变得如此糟糕以至于你需要 OOM 杀手。当系统管理员没有设置适当的限制时,这只是一个后备。
      【解决方案4】:

      一个可能更好但更复杂的答案(比 ulimit)是自定义分配器,它限制任何给定分配的最大大小(100MB 左右),但限制允许的总内存要使用..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-04
        • 1970-01-01
        • 1970-01-01
        • 2012-07-15
        • 2014-11-22
        • 2016-02-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多