2010-02-02 78 views
0

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

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

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

我完全困惑。

+0

我认为MEMORYSTATUSEX.ullAvailVirtual只意味着未预留的内存大小。只要进程正在运行,该值总是小于或等于先前的值。 – Buzz 2010-02-02 08:55:30

回答

0

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

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

0

当您删除分配的内存时,操作系统不会立即返回该内存,而是保留该进程的内存,至少直到另一个进程需要该内存为止。这可以提高性能,因为几秒钟之后,几乎相同的进程可能需要刚删除的内存。

要真正释放内存中删除,你可以叫

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

也许这将迫使GlobalMemoryStatusEx()返回你期望的值?

+0

谢谢。我不确定我是否会尝试,因为它似乎是一个系统影响。 我将尝试TBB分配器。我发现它的分配速度比CRT默认的新速度快。它在大量内存分配方面看起来很独特。 – Buzz 2010-02-03 09:55:15