MEMORYSTATUSEX和GlobalMemoryStatusEx

时间:2014-09-26 17:54:11

标签: winapi win32-process

我使用MEMORYSTATUSEX.ullTotalVirtual和MEMORYSTATUSEX.ullAvailVirtual之间的区别来显示系统上使用的虚拟内存。

如果我的应用程序执行时,这个数字(两个成员之间的差异)会随着时间的推移而不断上升,这是否表示存在内存泄漏?

我有点怀疑它确实如此,但希望对此有所了解。

对:: SystemTimeToFileTime的多次调用似乎导致此数字随着时间的推移而增加。

更新:

bool f ( const SYSTEMTIME& sysTime, UINT64* localTime )
{
    FILETIME f;
    if ( !SystemTimeToFileTime ( sysTime, &f ) )
        return ( false );
    *localTime = ( static_cast < UINT64 > ( f.dwHighDateTime ) << 32 ) | f.dwLowDateTime;
    return ( true );
}

当我多次执行此功能时,会导致MEMORYSTATUSEX.AvailVirtual减少。我没有注意到这个过程中的任何性能问题导致我认为这不是内存泄漏。但我不明白为什么这会导致可用的虚拟内存减少。如果我注释掉这个函数,那么ullAvailVirtual就不会受到影响。

我正在运行Windows 7 32位。但是,我的同事在Windows 7 64位上看到了相同的行为。

1 个答案:

答案 0 :(得分:1)

问题出在你的程序的其他地方。以下程序(包括对f函数的错误修复)反复显示相同的值,无论您将其保持多长时间运行。

#include <windows.h>
#include <stdio.h>

bool f ( const SYSTEMTIME& sysTime, UINT64* localTime )
{
    FILETIME f;
    if ( !SystemTimeToFileTime ( &sysTime, &f ) )
        return ( false );
    *localTime = ( static_cast < UINT64 > ( f.dwHighDateTime ) << 32 ) | f.dwLowDateTime;
    return ( true );
}

int __cdecl main(int, char**)
{
    SYSTEMTIME st;
    GetSystemTime(&st);

    for (;;) {
       UINT64 result;
       for (int i = 0; i < 10000000; i++) f(st, &result);

       MEMORYSTATUSEX info = { sizeof(info) };
       GlobalMemoryStatusEx(&info);
       printf("%I64d\n", info.ullTotalVirtual - info.ullAvailVirtual);
    }
}

另请注意,打印的值不是系统使用的虚拟内存。它是您的流程使用的地址空间量。具体来说,您要减去这些值

  

ullTotalVirtual

     
    

调用进程的虚拟地址空间的用户模式部分的大小,以字节为单位。

  
     

ullAvailVirtual

     
    

当前在内的未预留和未提交内存量     调用进程的虚拟地址空间的用户模式部分,     以字节为单位。

  

它谈论的是虚拟地址空间,而不是虚拟内存。