我在网上发现了许多关于为什么任务管理器测量的进程的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(过程)资源管理器)。