2010-08-20 17 views
9

Me pregunto si hay un comando o instrucción simple en C# /. NET y/o Visual Studio que pueda decirme cuánta memoria es un objeto individual ¿tomando? Tengo una sospecha furtiva de que el operador de sizeof() me va a mentir ... ¿estoy justificado en esta creencia?Cómo medir la cantidad de memoria que ocupa un objeto individual .NET

No es una pregunta algo relacionado here, pero hay una respuesta definitiva se da en la forma de medir un objeto individual

Respuesta

7

No hay manera definitiva porque no es sencillo para cualquier tipo de objeto.

¿Qué pasa si ese objeto contiene referencias a otros objetos? ¿Qué pasa si esos otros objetos tienen otros objetos que hacen referencia a ellos? ¿Qué objeto en realidad posee ese espacio de memoria? ¿Es el que lo creó o el último en tocarlo? En cualquier punto, podría tener diferentes propietarios. ¿O simplemente te importa cuánto espacio ocupa la referencia?

También hay un montón de preguntas que han formulado esta así ... una búsqueda rápida se convierte en imagen:

How to get object size in memory?

C#: Memory usage of an object

Find out the size of a .net object

How much memory does a C#/.NET object use?

y la lista sigue en un ...

+0

bastante bien, gracias por los indicadores –

3

No hay una manera fácil y sizeof solo será bueno para los tipos de valor. Un objeto típico contiene referencias a listas y otros objetos, por lo que necesitaría recorrer todos los punteros para obtener el recuento de bytes real y agregar también los tamaños de puntero.

Puede consultar la .Net Profiling API, o utilizar un perfilador de memoria como dotTrace. Un generador de perfiles de memoria al menos lo ayudará a ver dónde se asigna la memoria y si la asignación de memoria es un problema en su aplicación. Esto a menudo es más útil que el tamaño del objeto real.

1

Me pregunto cómo funciona System.Runtime.InteropServices.Marshal.SizeOf()? Hay muchas funciones estáticas interesantes bajo el objeto Marshal que podrían ser útiles aquí.

+3

Esa torta es una mentira también. –

+0

Intrigante ... ¡Lo intentaré! –

3

Si puede, ¡serialícelo!

Dim myObjectSize As Long 

Dim ms As New IO.MemoryStream 
Dim bf As New Runtime.Serialization.Formatters.Binary.BinaryFormatter() 
bf.Serialize(ms, myObject) 
myObjectSize = ms.Position 
Cuestiones relacionadas