我的理解是,在本例中,docker的守护进程从操作系统中请求了1114 my的内存,为其分配了一段虚拟地址空间,但是物理内存直到进程实际需要时才会使用,这很好。
然而,当操作系统无法满足这个请求时,它怎么能说“当然,这是您的1.1GB”呢?malloc() (或任何docker正在使用的东西)不应该立即失败吗?
如果它实际上是“超卖”内存空间,那么malloc()返回值的意义何在?

发布于 2018-01-14 01:28:10
正如@case 3344003所述,之所以会出现这种情况,是因为Linux默认情况下(至少在我的情况下)过提交内存:
overcommit/
/proc/sys/vm/超额提交内存 这个开关知道三个不同的设置: 0: Linux内核可以自由地超额提交内存(这是默认的),使用启发式算法来确定是否有足够的内存可用。 1: Linux内核总是会过多地提交内存,并且永远不会检查是否有足够的内存可用。这增加了内存不足的风险,但也提高了内存密集型工作负载. 2: Linux内核不会过多地分配内存,只分配overcommit_ratio中定义的内存。
Debian的默认值是0。这意味着malloc不会失败,当机器无法在任何地方分配新页面时,内核的OOM杀手就会卷入其中。
进一步的阅读可以在https://www.etalabs.net/overcommit.html完成
发布于 2018-01-13 22:43:44
没有任何rational OS允许您分配虚拟内存,而不需要页面空间来备份它。可悲的是,有一些操作系统是不合理的(或者有系统参数来支持这种不合理的行为)。您的操作系统可能允许您的malloc调用成功地将页映射到内存,然后在尝试访问内存时失败。这使得调试成为一场噩梦。一些系统将此称为“过度承诺”。请注意,在OS术语中,这个术语通常用于完全不同的目的。
https://stackoverflow.com/questions/48242537
复制相似问题