我有一种情况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(使用前将#替换为@)