这个进程的虚拟内存如何大于物理内存+交换?

How can this process' virtual memory be bigger than Physical memory + Swap?

据我了解,在此示例中,docker 的守护进程已从 OS 请求 1114MB 内存,并为其分配了一段虚拟地址 space,但是直到进程实际需要它时才会使用物理内存。没关系。

但是,OS 怎么能说 "sure, here's your 1.1GB" 无法满足该请求呢? malloc()(或 docker 使用的任何东西)不应该立即失败吗?

如果它实际上是 "overselling" 内存 space,那么 malloc() 的 return 值有什么意义?

没有理性的 OS 会允许您在没有页面 space 备份的情况下分配虚拟内存。可悲的是,有 OS 是不合理的(或具有启用这种非合理行为的系统参数)。您的 OS 可能允许您的 malloc 调用成功地将页面映射到内存,然后在您尝试访问内存时失败。它使调试成为一场噩梦。某些系统将此称为 "overcommitment." 请注意,此术语在 OS 术语中通常用于完全不同的目的。

正如@user3344003 所说,发生这种情况是因为 Linux,默认情况下(至少在我的情况下)过度使用内存:

http://engineering.pivotal.io/post/virtual_memory_settings_in_linux_-_the_problem_with_overcommit/

/proc/sys/vm/overcommit_memory

This switch knows 3 different settings:

0: The Linux kernel is free to overcommit memory (this is the default), a heuristic algorithm is applied to figure out if enough memory is available.

1: The Linux kernel will always overcommit memory, and never check if enough memory is available. This increases the risk of out-of-memory situations, but also improves memory-intensive workloads.

2: The Linux kernel will not overcommit memory, and only allocate as much memory as defined in overcommit_ratio.

Debian 上的默认值为 0。这意味着 malloc 不会失败,当机器无法在任何地方分配新页面时,内核的 OOM 杀手将介入。

可在 https://www.etalabs.net/overcommit.html

进一步阅读