除了其他答案外,您还可以将Linux配置为要求对任何分配的内存进行备份,即使程序不使用它也是如此。
但是,过量使用内存和担心OOM杀手并不是Linux体验的必要部分。只需将sysctl参数vm / overcommit_memory设置为2即可关闭过量使用行为,并永远阻止OOM杀手。大多数现代系统应具有足够的磁盘空间,以在大多数情况下提供足够的交换文件。与其试图防止过度使用的内存耗尽时杀死宠物进程,不如仅仅完全避免这种情况,这可能会更容易。[ OOM杀手的喘息 ]
如果程序分配了内存,则内核可以简单地将更多页的交换标记为已提交。该指示存储在内核的内存管理器中,尚未触及实际的磁盘空间。在使用该内存之前,实际上无需交换任何内容。如果从不使用它们,那么交换使用将在不影响性能的情况下波动。
因为进程是用它们自己的地址空间或“视图”呈现的(首先是交换的工作方式),所以内核在管理方式上有很多余地。还是使用上面链接文章中的fork示例,因为共享新的内存页面比分配大量未使用的内存要多得多,因此可以分配写时复制内存,从而增加交换使用次数。实际写入时(可能不会发生),可以用任何未使用的RAM替换“已提交的交换”(然后增加RAM使用量并减少交换使用量)。想象一个分配了500MB的进程,该进程在使用了全部或几乎所有RAM的计算机上分叉。如果交换中有500MB可用空间(而且磁盘空间很便宜,那么今天的TB驱动器有1%是多少?:P),则无需复制内存(但是,
这样就避免了OOM杀手的可能性,并且假设内存分配(包括通过fork之类的“隐式”分配)立即成功或失败,并设计了大多数软件,这要简单得多,并且实际认识到,如果必须交换则可能会影响性能。这种影响几乎总是很小的,但是在最坏的情况下会导致交换失败(有时甚至比完全的内核崩溃或OOM杀手更可取)。
尽管我不知道Linux内存管理器如何工作的确切细节,但是这个答案是我自己的一般理解以及我多年来记得的内容。我试图重新编辑此答案,因此需要对OS设计有一个最低限度的了解(这是相当复杂的,不是我对自己非常感兴趣的事情),但似乎有些混乱。如果您知道如何进行改进,请告诉我。在令人抓紧的手上,这可能不是一个令人尴尬的基本问题。