使用GetProcessMemoryInfo测量的RAM使用率低于通过任务管理器测量的

时间:2017-03-17 13:16:13

标签: c++ windows memory ram taskmanager

我在网上发现了许多关于为什么任务管理器测量的进程的RAM使用率通常高于应用程序自己的代码在运行时测量的原因的讨论。有关此问题的优秀答案,请参阅:allocating ram shows double the ram usage in task manager

然而,奇怪的是,我发现相反的情况。我使用GetProcessMemoryInfo函数在应用程序内部进行测量,显示比任务管理器更高的RAM使用量。代码很简单:

#include <iostream>
#include <Windows.h>
#include <psapi.h>


int main(void)
{
    uint64_t currentUsedRAM(0);

    PROCESS_MEMORY_COUNTERS info;
    GetProcessMemoryInfo(GetCurrentProcess(), &info, sizeof(info));
    currentUsedRAM = info.WorkingSetSize;

    const int N(100000000);
    int *x = new int[N];        
    for (int i = 0; i < N; i++)
    {
        x[i] = 1;
    }

    GetProcessMemoryInfo(GetCurrentProcess(), &info, sizeof(info));
    currentUsedRAM = info.WorkingSetSize - currentUsedRAM;

    std::cout << "Current RAM used: " << currentUsedRAM << "\n";

    return 0;
}

输出为“当前使用的RAM:400007168”,以字节为单位(例如约400 Mb)。但是,在我的任务管理器中,应用程序进程显示为仅使用381.8 Mb,大约约为18 Mb。

为什么会这样?

有没有办法让这些收敛到同样的结果?

修改

根据提交中建议的链接,我还尝试将 Process Explorer 软件替换为任务管理器。使用时,测量值为391,892 Mb。它更接近于我从应用程序内测量中得到的结果,但仍然非常接近。

更重要的是,我尝试将阵列大小增加一个数量级。有趣的是,内部应用程序测量,任务管理器测量和Process Explorer测量也都增加了一个数量级。也就是说,应用程序内测量与这些软件之间的差异也会按比例增加,从大约18,8 Mb(任务管理器)或9 Mb(Process Explorer)到大约185 Mb(任务管理器)或102 Mb(过程)资源管理器)。

0 个答案:

没有答案