【发布时间】:2017-08-16 14:35:30
【问题描述】:
我目前正在使用this answer 中的代码,并按照 cmets 中的建议进行了一些细微的修改。但是,无论我在内存中分配了多少对象,列出的内存使用量总是比任务管理器列出的多约 14MB。为什么会这样?
std::stringstream ss;
PROCESS_MEMORY_COUNTERS_EX pmc;
GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc));
SIZE_T physMemUsedByMe = pmc.WorkingSetSize;
ss << "\nMEM: " << (physMemUsedByMe / 1024 / 1024) << " MB";
debugText.setString(ss.str());
正常构建的结果:
调试文本:
任务管理器:
资源监视器:
分配 10,000 个虚拟对象时的结果:
调试文本:
任务管理器:
资源监视器:
编辑:
按照 cmets 的建议使用资源监视器 (perfmon) 后,我发现 Working Set 的列与我正在使用的内存列表功能相匹配。但是,我仍然对为什么Working Set 列和Private 列之间存在~14MB 的差异感到困惑(后者似乎是任务管理器使用的)。为什么会这样?
【问题讨论】:
-
发布可编译代码。
-
任务管理器提供许多不同的内存测量。请指定您要引用的内容(提供完整的列标题)。
-
这仅在 windows 10 下?尝试使用
VM_COUNTERS_EX2.PrivateWorkingSetSize并与来自 taskmgr 的数据进行比较。但是在 win 8.1 和早期版本中,您的代码必须显示与 taskmgr 相同的结果 -
不要将任务管理器用作调试工具,它不是为此而设计的。它以并不总是显而易见的方式处理共享和分页的记忆。如果必须,请使用 perfmon。
-
共享 DLLS 不会被加载到每个进程空间中。它们被映射进去。这就是您所看到的差异。
标签: c++ windows winapi memory taskmanager