2012-02-22 36 views
14

Estoy tratando de medir, en un programa C#, el uso de la memoria.¿Cómo medir el uso de memoria con C# (como podemos hacer en Java)?

Me gustaría saber el equivalente C# de esta función de Java:

ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getCommitted() 

que representan la memoria total asignada para el montón. Necesito esto para saber el tamaño total de la memoria asignada para mi programa C#.

A continuación, en Java que puede conseguir la memoria utilizada con:

ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed() 

Actualmente utilizo esto en C# para obtener memoria utilizada:

Process_Memory = MyProcess.PrivateMemorySize64; 

pero no estoy totalmente seguro de que es la equivalente.

Por lo tanto, en resumen, ¿cómo puedo obtener el espacio total asignado para mi aplicación C# y el uso actual a la vez t?

EDIT:

De las respuestas y más investigación que he determinar esto:

la memoria actual en uso

System.GC.GetTotalMemory(false); 

Dar el número de bytes currentl y asignado en la memoria administrada. (http://msdn.microsoft.com/fr-fr/library/system.gc.gettotalmemory.aspx)

Este método devuelve un valor bajo y estoy bastante seguro de que no es realmente una representación de toda la memoria en uso como puedo conseguir con getUsed() en Java. En Java para la misma aplicación, la memoria utilizada comienza en 5 MB y alcanza 125 MB como máximo. Con C# obtengo de 1 a 5 MB con el método anterior.

Parece que:

MyProcess.PrivateMemorySize64; // return ~=25MB 

o

MyProcess.WorkingSet64; //return ~=20MB 

dar un valor más exacto de toda la memoria en uso. Pero no sé cuál debería usar ...

Para el memoria asignada mundialthis article sugiere utilizar:

Process_MemoryEnd1 = MyProcess.VirtualMemorySize64; 

devolverlo siempre el mismo valor lo largo de la Programm, alrededor de 169MB que parece justo en comparación con Java: de 64 MB a 170 MB máx

Todavía estoy en busca de todo lo que encontré una respuesta precisa es muy vaga y no estoy muy familiarizado con la gestión de memoria de Windows, no estoy realmente seguro de undertand los documentos que encontré:/

Respuesta

9

La clase estática GC proporciona todo este tipo de información.

Probablemente después de GC.GetTotalMemory().

EDIT:

que creo que los intentos de entrenamiento de su huella de memoria basada en objetos actualmente arraigados. SI desea que el tamaño total asignado para el proceso (es decir, incluido el búfer libre) use la clase Process. por ejemplo:

Process.GetCurrentProcess().WorkingSet64; 
+0

Sí sé esto, pero dar el tamaño real de los objetos en el montón administrado, es un valor bajo. No creo que esto sea representativo de toda la memoria asignada. –

+0

Entonces, creo que solo necesita usar todas las propiedades de la clase 'Process' si desea memoria asignada sin procesar (es decir, no tiene en cuenta ninguna de las funciones administradas de GC). 'PagedMemorySize64',' PrivateMemorySize64', etc. – Tyson

+0

Gracias, por lo que creo que si solo quiero procesar la memoria total asignada 'PrivateMemorySize64' puede ser suficiente. No entiendo qué es la memoria paginada ... –

13

Heres una manera, utilizando la GC:

public void Test() 
    { 
     long kbAtExecution = GC.GetTotalMemory(false)/1024; 

     // do stuff that uses memory here 

     long kbAfter1 = GC.GetTotalMemory(false)/1024; 
     long kbAfter2 = GC.GetTotalMemory(true)/1024; 

     Console.WriteLine(kbAtExecution + " Started with this kb."); 
     Console.WriteLine(kbAfter1 + " After the test."); 
     Console.WriteLine(kbAfter1 - kbAtExecution + " Amt. Added."); 
     Console.WriteLine(kbAfter2 + " Amt. After Collection"); 
     Console.WriteLine(kbAfter2 - kbAfter1 + " Amt. Collected by GC.");   
    } 

O, alternativamente, utilizando System.Diagnostics.PerformanceCounter para conseguir trabajo establecido Info:

PerformanceCounter performanceCounter = new PerformanceCounter(); 

performanceCounter.CategoryName = "Process"; 

performanceCounter.CounterName = "Working Set"; 

performanceCounter.InstanceName = Process.GetCurrentProcess().ProcessName; 

Console.WriteLine(((uint)performanceCounter.NextValue()/1024).ToString("N0")); 
+0

Gracias por la respuesta. Entonces, como dice el documento, 'GC.GetTotalMemory (false)' devuelve la cantidad de bytes actualmente asignados en la memoria administrada. Creo que puede ser el equivalente de getUse() en java. Pero, ¿cómo obtengo todo el espacio asignado? ¿'System.Diagnostics.Process.GetCurrentProcess(). PrivateMemorySize64' representa ese valor? –

+1

Eso es correcto, sí. –

+0

Para la segunda solución, generó un 'System.InvalidOperationException' –

Cuestiones relacionadas