【问题标题】:Virtual Size and GlobalMemoryStatusEx虚拟大小和 GlobalMemoryStatusEx
【发布时间】:2011-01-12 01:39:47
【问题描述】:

我的系统是 Windows XP。 TaskManager 中显示的 Virtual Size 与从 GlobalMemoryStatusEx 获取的 MEMORYSTATUSEX.ullAvailVirtual 不同。

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

但是当我删除内存时,任务管理器中的Virtual Size变小了,但是MEMORYSTATUSEX.ullAvailVirtual还是很小。不知道为什么……

我完全糊涂了。

【问题讨论】:

  • 我认为 MEMORYSTATUSEX.ullAvailVirtual 仅表示未保留的内存大小。并且只要进程在运行,这个值总是小于或等于之前的值。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    也许这会强制 GlobalMemoryStatusEx() 返回您期望的值?

    【讨论】:

    • 谢谢。我不确定我是否会尝试它,因为它似乎会影响系统。我将尝试 TBB 分配器。我发现它的分配速度比 CRT 默认新的快。它在大量的内存分配中显得与众不同。
    猜你喜欢
    • 2018-03-02
    • 2011-03-25
    • 1970-01-01
    • 2016-09-26
    • 2018-07-27
    • 2014-04-06
    • 2013-02-18
    • 1970-01-01
    • 2017-10-16
    相关资源
    最近更新 更多