为什么calloc无法在具有4GB RAM的系统上分配1GB?

taz*_*taz 3 c memory windows ram calloc

我打电话给calloc1个超过1千兆字节的元素.此调用返回NULL,并且检查errno显示内存不足错误.但是,在测试期间,我有大约4千兆字节的可用内存,更不用说可用的虚拟内存了.

在研究了这个问题后,我唯一能想到的calloc失败原因是我没有足够的连续内存.然而,在我看来,如果我有4Gb可用内存,它应该很容易有〜= 1Gb连续内存.有没有办法检查连续的内存可用性?如果这是问题,是否有一种直接的方式来"整理"内存?

或者这是否与分配的内存的块大小有关,所以它实际上试图分配比我可用的内存更多的内存?我有什么选择来确定失败的原因?成功分配这么多内存有哪些选择?

我在具有12Gb内存的本机Windows系统上.接下来,我将尝试在VM中运行,并为VM提供几千兆字节的内存,并检查虚拟机是否可以非透明地访问足够的连续内存.如果我今天完成,我会在此发布结果.

Mar*_*ins 6

取得成功的一个重要关键是为您的应用程序提供1GB的虚拟地址空间.对于32位Windows应用程序,默认情况是应用程序以大约2GB的地址空间开始.

如果您在应用程序之前在失败的应用程序之前进行了很多分配,则很可能已经划分出足够的原始地址空间,以便不留下1GB的连续地址空间.应用程序只能执行两个小的"策略性放置"分配,这些分配会破坏地址空间,使剩余部分都小于1GB.

  • 使用SysInternals实用程序`vmmap`(http://technet.microsoft.com/en-us/sysinternals/dd535533.aspx)查看Windows进程的虚拟内存映射.确保启用菜单选项以查看可用内存,并按大小和类型进行排序. (4认同)