2010-02-26 10 views

Respuesta

41

Consulte este SO question

Además intente esto

Process currentProcess = System.Diagnostics.Process.GetCurrentProcess(); 
long totalBytesOfMemoryUsed = currentProcess.WorkingSet64; 
+5

De acuerdo a este blog http://blogs.msdn.com/salvapatuel/archive/2007/10/13/ memory-working-set-explored.aspx Working set! = Memoria de proceso total –

+1

Pero en mis pruebas el valor de WorkingSet64 es muy muy similar al mostrado por el TaskManager –

+0

@Jader Dias - esta respuesta captura la esencia de lo que se requiere (uso del tipo System.Diagnostics.Process) pero tenga cuidado con lo que el recolector de basura puede o no puede hacer, de lo contrario puede terminar con resultados altamente engañosos. Le muestro cómo evitar este problema en mi respuesta –

3
+0

Encuentro esto contrarresta confuso. Ejemplo: "# total reservado Bytes": "Muestra la cantidad de memoria virtual en bytes, actualmente reservado por el recolector de basura." Entonces me pregunto? ¿Se trata de la memoria del proceso o de la memoria que se recopilará pronto? –

+0

'nueva PerformanceCounter ("Proceso", "bytes privados", "ConsoleApplication1.vshost"). RawValue' parece prometedor –

28

Si sólo desea medir el aumento de ejemplo, el uso de memoria virtual, causada por algunas operaciones diferentes que puede utilizar el siguiente patrón: -

GC.Collect(); 
GC.WaitForPendingFinalizers(); 
GC.Collect(); 

var before = System.Diagnostics.Process.GetCurrentProcess().VirtualMemorySize64; 

// performs operations here 

var after = System.Diagnostics.Process.GetCurrentProcess().VirtualMemorySize64; 

Esta es, por supuesto, asumiendo que su aplicación en no realizar operaciones en otros hilos, mientras que las operaciones anteriores se están ejecutando.

Puede reemplazar VirtualMemorySize64 con cualquier otra métrica que le interese. Eche un vistazo al tipo System.Diagnostics.Process para ver qué hay disponible.

+0

Por qué existe la necesidad de llamar a GC.Collect dos veces? – Viru

+4

La primera vez, los objetos se ponen en la cola freachable y más tarde se finalizan. Luego, son coleccionables. –

+0

Gracias @AdamRalph – Viru

2

He encontrado esto muy útil:

Thread.MemoryBarrier(); 
var initialMemory = System.GC.GetTotalMemory(true); 
// body 
var somethingThatConsumesMemory = Enumerable.Range(0, 100000) 
    .ToArray(); 
// end 
Thread.MemoryBarrier(); 
var finalMemory = System.GC.GetTotalMemory(true); 
var consumption = finalMemory - initialMemory; 
+10

Suspiro ... Así que cualquiera que lea esto no está confundido ... Usted solo proporcionó el código para un hilo, por lo que las llamadas a MemoryBarrier son inútiles (y no hay una versión de subprocesos múltiples de las que harían cualquier sentido, tampoco). No estoy seguro de lo que piensas que hacen, pero no es lo que realmente hacen. –

Cuestiones relacionadas