3

我有一种情况,malloc()返回NULL并设置errnoENOMEM. 但是 CRT 堆(可增长的)有大量内存可供使用。时malloc,我的进程内存约为 900 MB。主机进程是在 Sun HotSpot JVM 下执行的 Java 可执行文件。

malloc()我正在做的是 80 兆字节,并且失败了。如果我分配 60 MB,它会成功。之后,分配了 50 MB,然后是另一个,另一个也成功了:显然,我还有很多内存,但是 80 MB 的 malloc 似乎对于操作系统来说太“大”了。

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

HeapCreate(0, BYTES_PER_PAGE, 0)

根据文档HeapCreateHeapAlloc将自动调用VirtualAlloc大于 512KB 的块。

malloc()如果这不是内存不足,到底会导致什么失败?是不是我的记忆太碎片化了?我认为 Windows 会自动压缩堆。这真的很奇怪,我以前从未见过这种行为。

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

谢谢,马丁

4

0 回答 0