malloc返回NULL并将errno设置为ENOMEM,但是有足够的堆空间可用?

时间:2011-12-03 19:17:19

标签: winapi malloc crt heapalloc enomem

我遇到malloc()返回NULL并将errno设置为ENOMEM的情况。但是CRT堆(可以增长)有足够的内存可供使用。在malloc时,我的进程内存大约为900 MB。主机进程是在Sun HotSpot JVM下执行的Java可执行文件。

我正在做的malloc()是80兆字节,但都失败了。如果我分配60 MB,它就会成功。在那之后,50 MB的分配,然后是另一个也成功:显然,我仍然有很多内存,但80 MB malloc似乎太“大”消化了OS。

我正在使用带有4 GB RAM的Windows 7 x64 SP1。我的进程是一个32位进程,使用VC ++ 2010 SP1构建。我正在使用Low Fragmentation Heap,这是Win 7的默认值 - 我还使用HeapQueryInformation进行了验证。 我正在使用的VC2010 C运行时以这种方式创建堆:

HeapCreate(0, BYTES_PER_PAGE, 0)

根据HeapCreate的文档,HeapAlloc会自动为VirtualAlloc调用大于512KB的块。

如果这不是缺乏记忆,那么malloc()会导致失败的原因是什么?我的记忆力太碎了吗?我以为Windows会自动压缩堆。 这真的很奇怪,我以前从未见过这种行为。

另一台Windows XP SP3 32位计算机表现出相同的行为。

谢谢, 马丁

0 个答案:

没有答案