我遇到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位计算机表现出相同的行为。
谢谢, 马丁