你在做什么 malloc 返回0还是新投掷异常?只是停止或试图在OOM状态下生存/保存用户的工作?

有帮助吗?

解决方案

我会避免使用OM,例如避免崩溃。

避免执行大量工作(并分配大量记忆)。将数据保留在磁盘上,相信OS磁盘缓存,并尽可能多地使用内存映射的IO,并且一次仅在一小部分数据上操作。如果需要大量数据在线(延迟较低),那么像所有大型搜索引擎公司一样,将它们保持在几台机器的内存中。或购买SSD。

其他提示

大多数回答这个问题的人可能从未在嵌入式系统上使用,在嵌入式系统中,返回0是一种非常真实的可能性。在我目前正在处理的系统上,总共有4.25K字节的RAM(即4352个字节)。我正在为堆栈分配64个字节,目前有1600个字节堆。就在昨天,我正在调试一件堆步行程序,因此我可以遵循记忆的分配和释放。堆步行使用一个小的(30个字节)静态分配的缓冲区来输出到串行端口。它将为发布版本关闭。

由于这是一种消费产品,因此一旦发布该产品,它最好不会用尽内存。我确定它会在开发过程中。无论如何,我所能做的就是哔哔声几次,并强制重新启动。

老实说,在我完成的所有项目中(请记住我还没有在任何地方工作),我从来没有考虑过可能发生,因此我想我的程序会死亡。

此外,处理OOM还需要您对资源进行预先分配以显示错误消息或保存所有内容,这可能会带来不便。

我觉得这些天,记忆的成本低于花生,这不是应该经常发生的事情。在受保护的记忆和之前的曙光上,也许这是一个问题,但是现在呢?我见过的唯一的OOM错误是来自错误的代码。

无论如何,检查malloc返回代码是毫无意义的。

现代操作系统过度记忆:它们为过程提供的内存比实际可用。您的进程的内存是虚拟的,全部映射到单个零输出页面。

直到您写入内存,就可以为您的流程分配一个物理,唯一的页面。如果此分配失败,则内核将终止一个过程(也许是您的!),以寻找内存。那时,您无能为力。

除非您为嵌入式系统,实时系统或如此关键的系统开发,以至于失败可能会损失生命或数十亿美元……那么担心摆脱记忆条件可能并不值得。

在大多数情况下,无论如何,当您不在内存之外时,几乎无法做到,因为没有内存可以创建任何新对象或执行任何可能执行某件事的任务。您必须权衡应用程序处理OOM的成本,而不是从中获得的好处。

我总是会检查错误。如果某些内容返回错误条件,则必须由您的程序处理。即使这是一条消息,上面写着“不记忆力,必须去!”,它比“访问违规”,“ core dovsted”或其他任何内容都更好。一个是您处理的错误条件,另一个是错误。用户也会认为它。

对于您的具体情况,您可以尝试退回操作,释放您分配的资源,直到达到失败点,报告错误并继续执行(也许当您试图戒烟时,您可以给予立即退出的选项)。这样,用户可以决定该怎么做,或者尝试通过摆弄,关闭文件等来释放一些内存。互动可能只需要记录错误并退出或继续。

许可以下: CC-BY-SA归因
scroll top