虚拟大小和GlobalMemoryStatusEx

时间:2010-02-02 08:38:25

标签: windows visual-c++ memory-management windows-xp

我的系统是Windows XP。 TaskManager中显示的虚拟大小与从GlobalMemoryStatusEx获取的MEMORYSTATUSEX.ullAvailVirtual不同。

当我创建大量缓冲区并且内存使用率达到时,MEMORYSTATUSEX.ullAvailVirtual可以很好地反映虚拟大小的使用情况。它是一样的。

但是当我删除内存时,任务管理器中的虚拟大小已关闭,但MEMORYSTATUSEX.ullAvailVirtual仍然非常小。我不知道为什么......

我完全糊涂了。

2 个答案:

答案 0 :(得分:0)

可能遭受内存碎片化。 (即,如果你在每个大分配之间占用几个字节,它会有效地强制你的应用程序的虚拟字节)。

您可能会发现将数字与perfmon进行比较更为可靠 - 我过去一直使用的计数器是专用字节(实际分配的内存)和虚拟字节(分配的内存地址空间) - 如果这两个计数器发散,然后你有一个内存碎片问题,这将是内存泄漏的结果。任务管理器中的数字虽然真实准确,但并没有传达任何特别有用的信息。

答案 1 :(得分:0)

当您删除已分配的内存时,操作系统不会立即返回该内存,而是保留为该进程保留的内存,至少在另一个进程需要该内存之前。这样可以提高性能,因为完全相同的进程可能需要在几毫秒后再次删除内存。

要真正释放已删除的内存,可以调用

SetProcessWorkingSetSize(GetCurrentProcess(), (SIZE_T)-1, (SIZE_T)-1);

也许这会迫使GlobalMemoryStatusEx()返回您期望的值?