我的系统是Windows XP。 TaskManager中显示的虚拟大小与从GlobalMemoryStatusEx获取的MEMORYSTATUSEX.ullAvailVirtual不同。
当我创建大量缓冲区并且内存使用率达到时,MEMORYSTATUSEX.ullAvailVirtual可以很好地反映虚拟大小的使用情况。它是一样的。
但是当我删除内存时,任务管理器中的虚拟大小已关闭,但MEMORYSTATUSEX.ullAvailVirtual仍然非常小。我不知道为什么......
我完全糊涂了。
答案 0 :(得分:0)
你可能遭受内存碎片化。 (即,如果你在每个大分配之间占用几个字节,它会有效地强制你的应用程序的虚拟字节)。
您可能会发现将数字与perfmon进行比较更为可靠 - 我过去一直使用的计数器是专用字节(实际分配的内存)和虚拟字节(分配的内存地址空间) - 如果这两个计数器发散,然后你有一个内存碎片问题,这将是内存泄漏的结果。任务管理器中的数字虽然真实准确,但并没有传达任何特别有用的信息。
答案 1 :(得分:0)
当您删除已分配的内存时,操作系统不会立即返回该内存,而是保留为该进程保留的内存,至少在另一个进程需要该内存之前。这样可以提高性能,因为完全相同的进程可能需要在几毫秒后再次删除内存。
要真正释放已删除的内存,可以调用
SetProcessWorkingSetSize(GetCurrentProcess(), (SIZE_T)-1, (SIZE_T)-1);
也许这会迫使GlobalMemoryStatusEx()返回您期望的值?