¿Cómo obtener el tamaño del objeto en la memoria?

Necesito saber cuántos bytes consume mi objeto en la memoria (en C #). por ejemplo, cuánto mi Hashtable u SortedList o List .

esto puede no ser exacto, pero está lo suficientemente cerca de mí

 long size = 0; object o = new object(); using (Stream s = new MemoryStream()) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(s, o); size = s.Length; } 

No creo que pueda obtenerlo directamente, pero hay algunas maneras de encontrarlo indirectamente.

Una forma es usar el método GC.GetTotalMemory para medir la cantidad de memoria utilizada antes y después de crear su objeto. Esto no será perfecto, pero mientras controle el rest de la aplicación, puede obtener la información que le interesa.

Aparte de eso, puede usar un generador de perfiles para obtener la información o puede usar la API de generación de perfiles para obtener la información en el código. Pero eso no será fácil de usar, creo.

Ver ¿Cuánta memoria está siendo utilizada por un objeto en C #? por una pregunta similar.

De acuerdo, esta pregunta ha sido respondida y se aceptó la respuesta, pero alguien me pidió que respondiera, así que ahí está.

En primer lugar, no es posible decirlo con certeza. Es un detalle de implementación interna y no está documentado. Sin embargo, según los objetos incluidos en el otro objeto. Ahora, ¿cómo calculamos los requisitos de memoria para nuestros objetos en caché?

Anteriormente había tocado este tema en este artículo :

Ahora, ¿cómo calculamos los requisitos de memoria para nuestros objetos en caché? Bueno, como la mayoría de ustedes sabría, Int32 y float son cuatro bytes, double y DateTime 8 bytes, char es en realidad dos bytes (no un byte), y así sucesivamente. La cadena es un poco más compleja, 2 * (n + 1), donde n es la longitud de la cadena. Para los objetos, dependerá de sus miembros: simplemente resum el requisito de memoria de todos sus miembros, recordando que todas las referencias de objeto son simplemente punteros de 4 bytes en un cuadro de 32 bits. Ahora, esto no es del todo cierto, no nos hemos ocupado de la sobrecarga de cada objeto en el montón. No estoy seguro de si necesita preocuparse por esto, pero supongo que si va a utilizar muchos objetos pequeños, debería tener en cuenta los gastos generales. Cada objeto de montón cuesta tanto como sus tipos primitivos, más cuatro bytes para referencias de objetos (en una máquina de 32 bits, aunque BizTalk también ejecuta 32 bits en máquinas de 64 bits), más 4 bytes para el puntero de tipo de objeto, y creo que 4 bytes para el índice de bloque de sincronización. ¿Por qué es importante esta sobrecarga adicional? Bueno, imaginemos que tenemos una clase con dos miembros Int32; en este caso, el requisito de memoria es de 16 bytes y no de 8.

Objeto no administrado:

  • Marshal.SizeOf(object yourObj);

Tipos de valor:

  • sizeof(object val)

Objeto gestionado:

El siguiente fragmento de código debe devolver el tamaño en bytes de cualquier objeto que se le pase, siempre que se pueda serializar. Lo obtuve de un colega de Quixant para resolver un problema de escritura en SRAM en una plataforma de juegos. Espero que ayude. Crédito y gracias a Carlo Vittuci.

 ///  /// Calculates the lenght in bytes of an object /// and returns the size ///  ///  ///  private int GetObjectSize(object TestObject) { BinaryFormatter bf = new BinaryFormatter(); MemoryStream ms = new MemoryStream(); byte[] Array; bf.Serialize(ms, TestObject); Array = ms.ToArray(); return Array.Length; } 

En modo de depuración

cargar SOS

y ejecuta el comando dumpheap.