¿Cómo calcular el conjunto de trabajo privado (memoria)?

¿Cómo calculo el conjunto de trabajo privado de memoria usando C #? Estoy interesado en producir aproximadamente la misma cifra que taskmgr.exe .

Estoy usando el espacio de nombres Proceso y el uso de métodos / datos como WorkingSet64 y PrivateMemorySize64 , pero estas cifras están apagadas por 100 MB o más a veces.

    Este es un número muy variable, no puedes calcularlo. El administrador de memoria de Windows constantemente intercambia páginas dentro y fuera de la RAM. TaskMgr.exe lo obtiene de un contador de rendimiento. Puedes obtener el mismo número así:

     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(); } } 

    Tenga en cuenta que el número realmente no significa mucho, se reducirá cuando otros procesos comiencen y compitan por RAM.

    Para futuros usuarios, esto es lo que tuve que hacer para asegurarme de obtener el Conjunto de trabajo privado para los procesos que pueden tener varias instancias. Llamo CurrentMemoryUsage , que obtiene el nombre de proceso apropiado de GetNameToUseForMemory . Encontré que este ciclo era lento, incluso al filtrar los resultados donde podía. Entonces, esa es la razón por la que ves GetNameToUseForMemory usando un diccionario para almacenar el nombre en caché.

     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; } 

    ¿Tal vez GC.GetTotalMemory proporcionará los datos que necesita?