繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM