Как рассчитать частный рабочий набор (память)? - PullRequest
9 голосов
/ 10 апреля 2010

Как рассчитать частный рабочий набор памяти с помощью C #? Я заинтересован в том, чтобы производить примерно те же цифры, что и taskmgr.exe.

Я использую пространство имен Process и использую методы / данные, такие как WorkingSet64 и PrivateMemorySize64, но эти цифры иногда превышают 100 МБ или более.

Ответы [ 3 ]

29 голосов
/ 10 апреля 2010

Это очень переменное число, вы не можете рассчитать его. Диспетчер памяти Windows постоянно обменивается страницами в оперативной памяти и из нее. TaskMgr.exe получает его из счетчика производительности. Вы можете получить такой же номер, как этот:

using System;
using System.Diagnostics;

class Program {
    static void Main(string[] args) {
        string prcName = Process.GetCurrentProcess().ProcessName;
        var counter = new PerformanceCounter("Process", "Working Set - Private", prcName);
        Console.WriteLine("{0}K", counter.RawValue / 1024);
        Console.ReadLine();
    }
}

Имейте в виду, что число действительно мало что значит, оно упадет, когда другие процессы начнутся и будут конкурировать за оперативную память.

1 голос
/ 20 июня 2012

Для будущих пользователей, вот что мне нужно было сделать, чтобы получить частный рабочий набор для процессов, которые могут иметь несколько экземпляров. Я звоню CurrentMemoryUsage, который получает соответствующее имя процесса от GetNameToUseForMemory. Я нашел этот цикл медленным, даже с фильтрацией результатов, где я мог. Вот почему вы видите GetNameToUseForMemory, использующий словарь для кэширования имени.

private static long CurrentMemoryUsage(Process proc)
{
  long currentMemoryUsage;
  var nameToUseForMemory = GetNameToUseForMemory(proc);
  using (var procPerfCounter = new PerformanceCounter("Process", "Working Set - Private", nameToUseForMemory))
  {
    //KB is standard
    currentMemoryUsage = procPerfCounter.RawValue/1024;
  }
  return currentMemoryUsage;
}

private static string GetNameToUseForMemory(Process proc)
{
  if (processId2MemoryProcessName.ContainsKey(proc.Id))
    return processId2MemoryProcessName[proc.Id];
  var nameToUseForMemory = String.Empty;
  var category = new PerformanceCounterCategory("Process");
  var instanceNames = category.GetInstanceNames().Where(x => x.Contains(proc.ProcessName));
  foreach (var instanceName in instanceNames)
  {
    using (var performanceCounter = new PerformanceCounter("Process", "ID Process", instanceName, true))
    {
      if (performanceCounter.RawValue != proc.Id) 
        continue;
      nameToUseForMemory = instanceName;
      break;
    }
  }
  if(!processId2MemoryProcessName.ContainsKey(proc.Id))
    processId2MemoryProcessName.Add(proc.Id, nameToUseForMemory);
  return nameToUseForMemory;
}
0 голосов
/ 10 апреля 2010

Может быть GC.GetTotalMemory предоставит вам необходимые данные?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...