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

2023-12-10

我有一种情况malloc()回报NULL和集errno to ENOMEM。但 CRT 堆(可增长)有足够的内存可供使用。在那个时间malloc,我的进程内存约为900 MB。主机进程是在 Sun HotSpot JVM 下执行的 Java 可执行文件。

The 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)

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

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

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

谢谢, 马丁


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐