2010-09-27 15 views
13

¿Cómo puedo obtener la memoria real utilizada en mi aplicación C#?C# memory usage

  • Task Manager muestra diferencias en las métricas.
  • Process Explorer muestra un mayor uso de bytes privados.
  • El contador de rendimiento (perfmon.msc) mostró diferentes métricas
  • cuando utilicé el perfilador de memoria .NET, mostró que la mayor parte de la memoria es basura recolectada y solo algunos bytes activos.

No sé qué creer.

Respuesta

11

El uso de memoria es algo más complicado que mostrar un solo número o dos. Le sugiero que eche un vistazo al Mark Russinovich's excellent post en los diferentes tipos de contadores en Windows.

.NET solo complica aún más las cosas. Un proceso .NET es solo otro proceso de Windows, por lo que obviamente tendrá todas las métricas regulares, pero además de eso, el CLR actúa como un administrador de memoria para la aplicación administrada. Entonces, dependiendo del punto de vista, estos números variarán.

El CLR asigna y libera de manera efectiva la memoria virtual en grandes porciones en nombre de la aplicación .NET y luego entrega los bits de memoria a la aplicación según sea necesario. Entonces, aunque su aplicación puede usar muy poca memoria en un momento dado, esta memoria puede o no haber sido liberada al sistema operativo.

Además de eso, el CLR en sí usa memoria para cargar IL, compila IL a código nativo, almacena toda la información de tipo y así sucesivamente. Todo esto se agrega a la huella de memoria del proceso.

Si desea saber cuánta memoria usa su aplicación administrada para los datos, el contador Bytes en todos los montones es útil. Los bytes privados se pueden usar como una estimación aproximada para el uso de la memoria de la aplicación en el nivel del proceso.

También es posible que desee echa un vistazo a estas preguntas relacionadas:

Reducing memory usage of .NET applications?

How to detect where a Memory Leak is?

1

Descargar VADump (Si no lo tienes todavía)

Uso: VADUMP.EXE -sop [PID]

2

Si está utilizando VS 2010 puede utilizar Visual Studio 2010 Profiler. Esta herramienta puede crear informes muy informativos para usted.

+0

Tenga en cuenta que el generador de perfiles solo está disponible en las versiones más caras de VS. –

+0

sí @Brian Rasmussen tiene razón. Creo que solo VS Ultimate es compatible con Profiler. –

+0

Necesita VS 2010 premium o superior (que es impar, win7 prof >> home prem mientras que vs2010 prem >> vs2010 prof) – atamanroman

1

Bueno, lo que es "memoria real utilizada en mi aplicación C#"?

Gracias a la memoria virtual y (varias) capas de gestión de memoria en Windows y CLR, esta es una pregunta bastante complicada.

De las fuentes que mencione, el perfilador CLR le dará el desglose más detallado, lo llamaría el más preciso.

Pero no hay una respuesta de 'un solo número', la pregunta de si la Aplicación A usa más o menos memoria que B puede ser imposible de contestar.

¿Qué es lo que realmente quiere saber? ¿Tiene un problema de rendimiento concreto para resolver?

2

Si desea saber aproximadamente cuántos bytes están asignados en el montón del GC (ignorando la memoria utilizada por el tiempo de ejecución, el compilador JIT, etc.), puede llamar al GC.GetTotalMemory. Lo hemos usado al rastrear fugas de memoria.