我的理解是,在这个例子中,docker
的守护进程已经从操作系统请求了1114MB的内存,为其分配了一段虚拟地址空间,但物理内存不是&直到该过程实际需要它才被使用。没关系。
然而,操作系统怎么能说'确定,这是你的1.1GB"什么时候它无法满足这个要求?不应该malloc()
(或docker
使用的任何东西)立即失败吗?
如果它实际上超过了#34;记忆空间,malloc()
的返回值是什么?
答案 0 :(得分:3)
正如@ user3344003所说,这是因为Linux默认情况下(至少在我的情况下)过度使用内存:
http://engineering.pivotal.io/post/virtual_memory_settings_in_linux_-_the_problem_with_overcommit/
的/ proc / SYS / VM / overcommit_memory
此开关知道3种不同的设置:
0:Linux内核可以自由地过度使用内存(这是默认设置),应用启发式算法来确定是否有足够的内存可用。
1:Linux内核将始终过度使用内存,而不会检查是否存在 足够的内存可用。这增加了内存不足的风险 情况,但也改善了内存密集型工作负载。
2:Linux内核不会过度使用内存,只会分配overcommit_ratio中定义的内存。
Debian的默认值为0.这意味着malloc不会失败,当机器无法在任何地方分配新页面时,内核的OOM杀手将会参与其中。
进一步阅读答案 1 :(得分:0)
没有合理的操作系统可以让您在没有页面空间的情况下分配虚拟内存来备份虚拟内存。遗憾的是,有些操作系统不合理(或者有系统参数可以实现这种非理性行为)。您的操作系统可能允许您的malloc调用成功将页面映射到内存,然后在您尝试访问内存时失败。它使调试成为一场噩梦。有些系统称之为“过度承诺”。请注意,该术语在OS术语中通常用于完全不同的目的。