获取进程的内存(私有工作集)

本文关键字:工作集 取进程 内存 获取 | 更新日期: 2023-09-27 18:19:12

我的问题是我得到的WorkingSet与任务管理器内存(私有工作集)非常不同。我已经尝试了各种解决方案写在。NET上,但值太远离匹配。请帮助我从任务管理器获得内存(私人工作集)。

script += string.Format(@"$Processes = Get-Process -ComputerName {0} | Sort-Object WorkingSet -desc | Select-Object;", remoteMachineName);
script += @"$ProcessArray= @();";
script += @"foreach ($process in $Processes) {";
script += @"$ProcessName = $process.ProcessName;";
script += @"$ProcessSize = $process.WorkingSet/1KB;";
script += @"$objAverage = New-Object System.Object;";
script += @"$objAverage | Add-Member -type NoteProperty -name Name -value $ProcessName;";
script += @"$objAverage | Add-Member -type NoteProperty -name Memory -value $ProcessSize;";
script += @"$ProcessArray +=$objAverage; }; ";

获取进程的内存(私有工作集)

在进程管理器中显示的Memory (Private Working Set)是性能计数器'Process'working Set - Private的值。

您可以使用以下命令检索此值:

$ProcessPrivateSet = Get-Counter "'Process(instancename)'Working Set - Private"
$WSPrivateKiloBytes = $ProcessPrivateSet.CounterSamples[0].CookedValue / 1KB

$WSPrivateKiloBytes现在与您在进程管理器中看到的值相同。


为一个不同的进程检索此值的问题是,性能计数器按进程名称+实例计数来命名进程实例,而不是按进程ID。

因此,如果您启动一个Java应用程序实例,您可以检索java.exe进程的计数器,如下所示:

Get-Counter "'Process(java)'Working Set - Private"

现在,如果你启动另一个,你需要像这样引用它:

Get-Counter "'Process(java#1)'Working Set - Private"

等等

您可以通过在本地系统上为性能计数器对象设置ProcessNameFormat来更改此行为,如下所示:

$RegPath = "HKLM:'SYSTEM'CurrentControlSet'Services'PerfProc'Performance'"
Set-ItemProperty $RegPath -Name ProcessNameFormat -Value 2 -Type DWord

值为2表示"在实例名中包含进程ID",值为1(默认)表示"使用实例计数器"(如上所示)。

新格式为processname_id


更改ProcessNameFormat之后,现在可以检索特定进程ID的性能计数器,如下所示:

$javap = Get-Process -Name java | Select -First 1
Get-Counter "'Process(java_$($javap.Id))'"

由于您现在在Get-Process输出和性能计数器之间有了明显的相关性,您现在可以检索每个进程的"私有工作集"值,使用一个计算属性使用单个Select-Object语句:

Get-Process java | Select Name,Id,@{Name="WSPrivate(KB)";Expression = {(Get-Counter "'Process($($_.Name)_$($_.Id))'Working Set - Private").CounterSamples[0].CookedValue / 1KB}}

花费一些时间来检索每个单独的计数器样本,所以如果您计划经常这样做,或者对于一组大型进程,您可能希望使用通配符(*)并检索'Process(*)'Working Set - Private,然后查看CounterSamples

中的每个条目中的InstanceName