首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个进程的虚拟内存怎么会比物理内存+交换大呢?

这个进程的虚拟内存怎么会比物理内存+交换大呢?
EN

Stack Overflow用户
提问于 2018-01-13 17:43:17
回答 2查看 139关注 0票数 1

我的理解是,在本例中,docker的守护进程从操作系统中请求了1114 my的内存,为其分配了一段虚拟地址空间,但是物理内存直到进程实际需要时才会使用,这很好。

然而,当操作系统无法满足这个请求时,它怎么能说“当然,这是您的1.1GB”呢?malloc() (或任何docker正在使用的东西)不应该立即失败吗?

如果它实际上是“超卖”内存空间,那么malloc()返回值的意义何在?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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完成

票数 3
EN

Stack Overflow用户

发布于 2018-01-13 22:43:44

没有任何rational OS允许您分配虚拟内存,而不需要页面空间来备份它。可悲的是,有一些操作系统是不合理的(或者有系统参数来支持这种不合理的行为)。您的操作系统可能允许您的malloc调用成功地将页映射到内存,然后在尝试访问内存时失败。这使得调试成为一场噩梦。一些系统将此称为“过度承诺”。请注意,在OS术语中,这个术语通常用于完全不同的目的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48242537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档