如何计算私人工作集(记忆)?

sho*_*app 9 c# memory memory-management

如何使用C#计算内存的私有工作集?我有兴趣制作大致相同的数字taskmgr.exe.

我正在使用Process命名空间并使用类似WorkingSet64和的方法/数据PrivateMemorySize64,但这些数字有时会减少100MB或更多.

Han*_*ant 29

这是一个高度可变的数字,你无法计算它.Windows内存管理器不断地将页面交换进RAM.TaskMgr.exe从性能计数器获取它.你可以得到这样的数字:

using System;
using System.Diagnostics;

class Program {
    static void Main(string[] args) {
        string prcName = Process.GetCurrentProcess().ProcessName;
        var counter = new PerformanceCounter("Process", "Working Set - Private", prcName);
        Console.WriteLine("{0}K", counter.RawValue / 1024);
        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这个数字并不意味着什么,当其他进程开始并争夺RAM时,它会下降.

  • 虽然所说的都是正确的,但我想补充一点,只是使用`ProcessName`来查找匹配的计数器实例是不够的.如果您有多个具有相同的进程(例如svchost.exe),则计数器名称将为"svchost#1","svchost#2"等.您需要通过"ID Process"计数器进行匹配,该计数器也是进程类别和`Process.ID`. (9认同)
  • 你是什​​么意思,“这个数字真的没有多大意义”?这个数字不是代表进程使用了​​多少不能与另一个进程共享的内存吗?我有兴趣构建一个可以杀死进程“滥用”进程的服务——“滥用”被定义为使用超过 x 多 MB 内存的进程。如果我使用的数字真的没有多大意义,我会讨厌编写服务。你有什么建议? (2认同)
  • 不,这个数字不是这个意思。您正在寻找“私有字节”,即进程占用的无法与其他进程共享的“虚拟”内存量。 (2认同)