【问题标题】:How to add new memory allocator to deal with low memory?如何添加新的内存分配器来处理低内存?
【发布时间】:2012-08-05 23:24:57
【问题描述】:

在讨论newmalloc 之间区别的this answer 中,newmalloc 的区别之一为Can add a new memory allocator to deal with low memory (set_new_handler)

请举例说明它是如何工作的?

【问题讨论】:

    标签: c++ new-operator


    【解决方案1】:

    它并不完全是一个新的内存分配器,而是一个可以注册的函数,以便在operator new 内存不足时调用它。

    如果你能神奇地解决内存不足的问题,new 可以再试一次,看看它现在是否能更好地工作。这通常不是很有用,除非您的应用程序占用了一些可以释放的内存。

    【讨论】:

      【解决方案2】:

      这里有几个例子可能会用到新的处理程序。

      1. 假设您在一个类似 unix 的机器上,出于某种原因,系统管理员在该机器上设置了堆大小的软限制。新的处理程序可以将软限制提高到硬限制,瞧!可能有新的内存可用。

      2. 假设您希望您的应用程序占用所有内存,但其他已经在运行的应用程序阻碍了。因此,只需让您的新处理程序休眠一点。当其中一个已经运行的程序终止时,中提琴!新内存可用。

      至少有一个商业应用程序采用选项 #2。这几乎总是一个错误。通常,应用程序的内存不足是因为应用程序的用户无意中试图分配比任何计算机上存在的内存更多的内存。当其他正在运行的应用程序退出时,该应用程序将愉快地咀嚼更多的内存。最终无法启动新程序,包括操作系统需要运行的程序。这个应用程序是一个相当不错的工具,可以让机器崩溃。

      【讨论】:

      • 我重申 holtavolt 关于不离开 cmets 的随机投票者的评论。我已经看到我在现实世界中使用的答案中概述的两种方法。选项 #1,逐渐提高堆大小的软限制,在某些系统上是推荐的做法。也许很愚蠢,但仍然建议练习。选项#2,像秃鹰一样盘旋,等待其他程序死亡,是一种广泛使用的商业工具使用的方法。
      【解决方案3】:

      我认为“内存不足”实际上也表示您链接的答案中的“内存不足”。有大量示例代码片段通过搜索 set_new_handler 来安装内存不足处理程序(例如 http://www.cplusplus.com/reference/std/new/set_new_handler/

      我见过的一个实现(在内存特别密集的应用程序的生产代码中)将此钩子与应用程序启动时约 10MB 的“雨天”块分配结合使用。如果这个处理程序被触发过,它将删除内存并尝试进入“受控退出”路径。

      在实践中,我发现这不是一种非常有效的技术,因为一旦内存不足,行为已经无法预测。

      【讨论】:

      • 没有解释的否决票是没有帮助的,尤其是当这个答案解决了 OP 请求并以实际经验作为支持时。请说明理由?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      • 2015-05-29
      • 1970-01-01
      • 2020-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多