Linux上的虚拟内存大小

我想深入了解OS Linux上的虚拟内存pipe理。

我不太了解操作系统如何确定进程的虚拟机的大小。

我知道一个32位的x86操作系统可以放弃3 GB的虚拟主机空间…这是否一直如此?

在我的情况下,我有大约110 MB的物理内存和32位的Linux,而我的主进程有一个约660 MB的虚拟机地址空间。 但是,物理内存(我的进程的RSS)只有50 MB,所以我的物理内存不足。 其余的是免费的,几乎整个被页面caching使用。 这似乎是一个正常的行为。

如果我检查/ proc / my_process_PID / smap,有几个8 MB的匿名VMA。

我的实际问题是,我需要在代码中做一个额外的10 MB malloc,但不幸的是,OOM​​杀手杀死了我的进程(内存不足)…我认为在vm中没有更多的可用空闲页面堆,不是吗? 有没有一个巨大的内存泄漏?

为什么OS没有扩展我的进程VM大小呢?

有关信息,vm大小是无限制的:ulimit -v:unlimited

Solutions Collecting From Web of "Linux上的虚拟内存大小"

每个进程可以拥有3GB的虚拟内存(大约在许多32位Linux上),并且在千兆字节的虚拟内存上继续创建占用千兆字节的新进程。 内核的开销很小,但是虚拟内存很便宜。 您使用的地址空间量可能不重要,可能不会触发OOM杀手。

但是,您的系统只有这么多的RAM。 当你开始在你的地址空间使用页面(写入)时,内核被迫找到物理RAM来映射它们。 如果没有物理内存,内核可以从内存中驱逐其他页面 – 将其交换出去或丢弃。 但是,如果它不能驱逐任何页面,则会触发OOM杀手。

用完地址空间将导致malloc在我的系统上返回NULL ,而不是触发OOM杀手。

这听起来像你的过程只是使用太多的RAM。 RSS不是你的进程使用的内存数量,而只是现在在物理内存中的数量。 如果你的进程存在内存泄漏并且持续增长,那么RSS最终会停止增长 – 因为对于你使用的每一个新页面,内核都会从你的进程中逐出一个页面。

尝试使用内存分析器,如Valgrind 。 这将帮助你理清你应该担心的内存(malloc)以及你可以忽略的内存(共享库和其他内存映射文件)。 内核(和/ proc)不会给你足够的细节。

Linux系统上可用的虚拟内存空间总量(大致)是RAM + swap spacekernel overhead 。 RAM是你已经安装的硬件,内核开销大致是一个常量(不过在内核版本之间有所不同),所以控制可用虚拟机总空间的唯一简单方法是添加或删除交换空间。

除了总数限制之外,还有每个进程的虚拟机限制。 这是可配置的(至少在32位linux上)最多3GB,但可能会少一些。 ulimit -v会告诉你这个限制,或者可以用来改变它。

当一个进程请求更多的虚拟机空间(通常通过malloc)时,内核会查看所有这些限制,如果有超过这些限制,将返回0.另一方面,OOM杀手只会在你已经接近总VM的限制。 但是,当OOM杀手杀死你的时候,你就会死亡 – 没有内存不足的错误或任何机会来捕捉它。

所以,如果你真的遇到了VM的总数限制,为了避免这种情况发生,你可以分配更多的交换空间,或者摆脱使用大量虚拟机空间的其他进程(首先终止或不启动)从而为你的程序释放一些。