我的开发环境是VS2008、DX9和Windows XP。
我试图在内存不足的情况下添加保护处理。当malloc返回NULL时,我会将一些资源分页到磁盘上,并释放内存中的资源。
但有时候,即使我释放了大部分资源并且任务管理器中的进程内存使用率和VM大小仅为800MB,malloc仍然总是返回NULL。
我认为在进程内存使用率只有800MB的情况下,使用malloc分配88字节应该没有问题。但malloc总是返回NULL。
这可能是内存碎片化吗?看起来不像,因为进程内存使用率并不太高。
我的开发环境是VS2008、DX9和Windows XP。
我试图在内存不足的情况下添加保护处理。当malloc返回NULL时,我会将一些资源分页到磁盘上,并释放内存中的资源。
但有时候,即使我释放了大部分资源并且任务管理器中的进程内存使用率和VM大小仅为800MB,malloc仍然总是返回NULL。
我认为在进程内存使用率只有800MB的情况下,使用malloc分配88字节应该没有问题。但malloc总是返回NULL。
这可能是内存碎片化吗?看起来不像,因为进程内存使用率并不太高。
malloc
是通过Windows Heap API工作的。它不会直接从系统中分配内存,也不会直接将其返回给系统。这意味着这个监视器将无法为您显示任何内容。对于这样的监视器来说,整个程序堆看起来就像一个坚固的、不可穿透的永久分配内存的黑盒子。 - AnT stands with Russia可能是虚拟地址空间的碎片化。一种检查方法是调用HeapCompact(GetProcessHeap(), 0)
。如果这样能够释放足够的内存,那么这很可能是原因。
另一个类似的原因是从调试器启动;这会导致Windows使用调试堆,长时间使用会导致非常糟糕的内存行为。为了禁用这种行为,在环境中设置_NO_DEBUG_HEAP=1
并运行。