Answers:
我会像避免崩溃一样避免OOM。
避免一次执行大量工作(并分配大量内存)。将数据保留在磁盘上,信任OS磁盘缓存,并尽可能多地使用内存映射的IO,并且一次只能处理一小部分数据。如果需要在线存储大量数据(以低延迟提供),则像所有大型搜索引擎公司一样,将它们保存在多台计算机的内存中。或购买SSD。
回答这个问题的大多数人可能从未在嵌入式系统上工作过,因为malloc返回0的可能性非常大。在我当前正在使用的系统上,总共有4.25K字节的RAM(即4352字节)。我为堆栈分配了64个字节,当前有1600个字节的堆。就在昨天,我正在调试堆遍历例程,以便可以跟踪内存的分配和释放。堆遍历使用一个小的(30字节)静态分配的缓冲区输出到串行端口。对于发行版本,它将关闭。
由于这是消费类产品,因此最好不要在产品发布后耗尽内存。我相信它将在开发过程中。无论如何,我所能做的就是让扬声器发出几次哔声,然后重新启动。
无论如何,检查malloc返回代码通常是毫无意义的。
现代操作系统过量使用内存:它们为进程提供的内存超过了实际可用的内存。授予您的进程的内存是虚拟的,所有内存都映射到单个清零页面。
直到您写入内存后,才会为进程分配一个物理的唯一页面。如果此分配失败,内核将终止进程(也许是您的进程!)以尝试查找内存。到那时,您无能为力了。
除非您是为嵌入式系统,实时系统或如此关键的系统而开发,否则故障可能会导致生命或数十亿美元的损失。
在大多数情况下,无论如何,当您的内存不足时,几乎无能为力,因为没有内存可以创建任何新对象或执行任何可能做某事的任务。您必须权衡处理OOM的应用程序成本与从中获得的收益。