Come calcolare il working set privato (memoria)?

Come faccio a calcolare il set di lavoro privato della memoria usando C #? Sono interessato a produrre all’incirca la stessa cifra di taskmgr.exe .

Sto utilizzando lo spazio dei nomi Process e utilizzando metodi / dati come WorkingSet64 e PrivateMemorySize64 , ma queste cifre sono distriggerste a PrivateMemorySize64 MB o più a volte.

Questo è un numero altamente variabile, non puoi calcolarlo. Il gestore della memoria di Windows scambia costantemente le pagine dentro e fuori la RAM. TaskMgr.exe ottiene da un contatore delle prestazioni. Puoi ottenere lo stesso numero in questo modo:

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

Fai attenzione che il numero in realtà non significa molto, cadrà quando altri processi iniziano e competono per la RAM.

Per gli utenti futuri, ecco cosa dovevo fare per essere sicuro di ottenere il working set privato per i processi che potrebbero avere più istanze. Chiamo CurrentMemoryUsage , che ottiene il nome del processo appropriato da GetNameToUseForMemory . Ho trovato questo ciclo lento, anche con il filtraggio dei risultati dove potevo. Quindi, ecco perché vedi GetNameToUseForMemory usando un dizionario per memorizzare il nome nella cache.

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

Forse GC.GetTotalMemory fornirà i dati di cui hai bisogno?