![](/img/trans.png)
[英]Optimal way to get Private Working Set Memory in C# for a specific instance of a process
[英]Get Memory (Private Working Set) of Process
我的问题是,我为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; }; ";
在Process Manager中显示为Memory(专用工作集)的是性能计数器\\Process\\working Set - Private
。
您可以使用以下方法检索此值:
$ProcessPrivateSet = Get-Counter "\Process(instancename)\Working Set - Private"
$WSPrivateKiloBytes = $ProcessPrivateSet.CounterSamples[0].CookedValue / 1KB
$WSPrivateKiloBytes
现在与在流程管理器中看到的值相同。
为不同的流程检索此值的问题在于,性能计数器通过流程名称+实例计数而不是流程ID来命名流程实例。
因此,如果启动Java应用程序的1个实例,则可以检索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
,您现在可以检索特定Process 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.