2008-10-21 10 views
6

Tengo un objeto estático en tiempo de ejecución que es básicamente una lista de otros objetos (ints, cadenas, diccionario, otros objetos, etc.). ¿Hay forma de determinar la memoria utilizada por mi objeto estático de "lista de otros objetos" en tiempo de ejecución? Esto sería útil para fines de instrumentación e informes.¿Cuál es la huella de memoria de un objeto en Runtime en .NET?

Respuesta

2

Probablemente esté pidiendo algo que pueda llamar desde su código (que me gustaría saber también), pero sentí que debería mencionar Ants profiler [http://www.red-gate.com/Products/ants_profiler/index.htm] en caso de que otros no estén buscando algo tan específico. Le informará todo tipo de información sobre su código mientras se está ejecutando, incluida la cantidad de memoria que se está utilizando.

Desde su página web ...

memoria de perfiles para comprender cómo su aplicación utiliza la memoria, y para localizar pérdidas de memoria. El perfilador de memoria le permite tomar instantáneas en cualquier punto en la ejecución de su programa , para que pueda ver qué memoria está usando en ese momento. Puede tomar varias instantáneas en diferentes momentos mientras su aplicación se está ejecutando, por lo que puede comparar la memoria de la aplicación estados.

+0

de hecho estoy buscando una ejecución programática. Pero estoy de acuerdo en que ANTS Profiler definitivamente puede ser útil en las situaciones correctas :) – Bullines

3

Sizeof se puede utilizar en los tipos de valor también hay Marshal.SizeOf que se puede utilizar con algunos consejos para .NET:

http://www.pixelicious.net/2008/07/03/exception-trying-to-get-the-size-of-a-c-class-using-marshalsizeof

... Pero eso no es exactamente el total de costo ya que el tiempo de ejecución asigna bytes adicionales para las clases de cosas como bloques de sincronización.

Si usted está realmente interesado en la medición de este tipo de cosas, sin embargo, se debe utilizar la API de perfiles:

http://msdn.microsoft.com/en-us/library/ms404386.aspx

o una herramienta libre como windbg que pueden hacer todo tipo de cosas maravillosas.

1

No sin un generador de perfiles. Ya es bastante difícil para una sola clase: consulte here.

2

Pruebe la biblioteca de depuración de SOS. Es lo mejor que hay. Artículos here y here

0

Gracias por las respuestas. Creo que mi plan inicial de ataque, porque estoy seguro que la mayoría de los objetos será serializable, será algo como esto:

using (MemoryStream memstream = new MemoryStream()) 
{ 
    BinaryFormatter formatter = new BinaryFormatter(); 

    try 
    { 
     formatter.Serialize(memstream, myObjectOfObjects); 
     mem_footprint += memstream.Length; 
    } 
    catch 
    { 
     // not a serializable object 
    } 
} 
Cuestiones relacionadas