获取进程的内存(私有工作集)
本文关键字:工作集 取进程 内存 获取 | 更新日期: 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
。