如何获取进程的准确非共享物理内存使用情况

Posted

技术标签:

【中文标题】如何获取进程的准确非共享物理内存使用情况【英文标题】:How to acquire the exact, non-shared physical memory usage of a process 【发布时间】:2017-12-22 00:24:21 【问题描述】:

当我对从 Process.GetProcesses() 生成的进程集合的 WorkingSet64 属性求和时,总和小于 GlobalMemoryStatusEx 指示的总物理内存使用量。

当我在一个进程上运行一个操作(例如,加载一个大文件或注入代码等)时,系统的物理内存会跳起来,但 WorkingSet64 和没有跟踪这个。

有没有办法获取特定进程的实际非共享物理内存使用情况?

【问题讨论】:

这不是 C# 问题,也没有简单的答案。 Windows 和 Linux 都使用许多不同类型的内存页面和内存池,它们在任务管理器中或通过函数以非常简化的方式显示。那些应该被分页但还没有被删除的页面呢?如果需要,它们可以重新使用,但不计入进程总数。 如果您真的关心 准确 答案,您应该检查 Windows Internals 以了解不同类型的池并选择所需的计数器。一个快速而肮脏的替代方法是读取进程的所有内存计数器并保留那些看起来很有趣的计数器。或者您可以保留 Working Set - Private 计数器,它聚合了各种其他计数器。 也检查Windows Process Memory Usage Demystified,它在VMMap的帮助下解释了不同的内存池 【参考方案1】:

您可以获得进程的私有工作集。

*** answer:

“私有工作集是一个进程使用的内存量,不能在其他进程之间共享,而工作集包括其他进程共享的内存。”

您可以使用 ProcessCounter 来访问此值。

Process thisProc = Process.GetCurrentProcess();
PerformanceCounter PC = new PerformanceCounter();

PC.CategoryName = "Process";
PC.CounterName = "Working Set - Private";
PC.InstanceName = thisProc.ProcessName;
int privateMemory = PC.Next()/1000; //this will be in KB.

【讨论】:

以上是关于如何获取进程的准确非共享物理内存使用情况的主要内容,如果未能解决你的问题,请参考以下文章

如何查看虚拟内存使用情况

Linux查看内存占用情况

adb命令查看手机应用内存使用情况

adb 查看内存,cpu,流量

Linux如何获取进程在物理内存中的所有内容?当进程在内存中的内容发生变化时,又如何获知?内核中实现

Linux 用top命令查看CPU和内存使用情况