【问题标题】:Get Memory (Private Working Set) of Process获取进程的内存(私有工作集)
【发布时间】:2015-10-26 11:26:39
【问题描述】:

我的问题是我得到的 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; }; ";

【问题讨论】:

标签: c# powershell


【解决方案1】:

进程管理器中显示为内存(私有工作集)的是性能计数器\Process\working Set - Private的值。

您可以通过以下方式检索此值:

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

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


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

因此,如果您启动 1 个 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

【讨论】:

    猜你喜欢
    • 2011-04-15
    • 2023-04-09
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 2014-09-13
    • 2013-03-25
    • 2019-07-25
    相关资源
    最近更新 更多