2009-02-17 11 views
5

¿Hay alguna manera de determinar cuánta memoria se utiliza para un objeto en particular? Por ejemplo, una lista. Teniendo todo en cuenta, como el interinato de cadenas y todo lo que hace el compilador/entorno de ejecución/lo que sea.C#: uso de la memoria de un objeto

+0

Duplicado: http://stackoverflow.com/questions/426396/how-much-memory-does-ac-net-object-use – FerranB

+0

Parece que ... disculpa por :) :) – Svish

Respuesta

2

Realmente tendría que definir exactamente lo que quiere decir con "cuánta memoria se utiliza para un objeto en particular". Por ejemplo, podría querer decir "si este objeto fuera basura recolectada, cuánto sería liberado", o podría significar "cuánta memoria ocupa este objeto y todo lo que toca".

Su punto sobre el interinato de cuerdas es un buen ejemplo. Supongamos que haces:

List<string> internedStrings = new List<string>(); 
List<string> nonInternedStrings = new List<string>(); 
for (int i=0; i < 1000; i++) 
{ 
    string tmp = new string(' ', i+1); 
    nonInternedStrings.Add(tmp); 
    tmp = tmp.Intern(); 
    internedStrings.Add(tmp); 
} 

¿Se nonInternedStrings realmente ocupan más memoria que internedStrings? Si internedStrings se recogieron basura, no liberaría tanta memoria, pero si internedStrings nunca hubiera sido creado (incluida la no interna de cada uno de sus elementos), entonces nunca se habría requerido más memoria.

Si puede ser más específico acerca de exactamente lo que quiere decir, es posible que podamos ayudarle. Sin embargo, es un problema complejo.

+0

, bueno, eso es exactamente lo que quería saber: p Si, cuando obtengo un montón de filas de la base de datos (donde muchas filas incluyen el mismo cadenas en algunas columnas), ¿debería trabajar para asegurarme de que están internados, o no debería molestarme con eso? – Svish

+0

Haría lo más simple que funciona para empezar, y luego perfilaré tu aplicación para ver cuánta memoria usa. Sin embargo, no usaría String.Intern. He dejado una respuesta en tu otra pregunta para explicar por qué. –

+0

lo comprobará, gracias =) – Svish

1

¿Has probado CLR Profiler 2.0?

+1

No. ¿Debería quizás? prueba eso. Sin embargo, esperaba algo en el código. Así que podría ordenar Console.WriteLine (MemoryUsageOf (someObject)) o algo así: p – Svish

+0

CLR Profiler le proporciona una gran cantidad de información a lo largo de la información de la memoria ... La mejor manera de escribir código es escribir ningún código;) –

+0

Si funcionara ... Funcionando el programa funciona, el lanzamiento de mi programa funciona. Pero cuando salgo de mi programa, el CLR Profiler arroja una excepción: – Svish

2

Esto parece ser un hermano de este Delphi question. Un algoritmo ingenuo no tendrá en cuenta la diferencia entre la agregación y la composición. Incluso un algoritmo basado en la marca y el barrido no le dirá si una tabla hash tuvo que hacer crecer su matriz interna porque un objeto fue referenciado por ella. Probablemente sea mejor perfilar su aplicación para una variedad de escenarios y trazar el uso de recursos contra N, donde N es una medida de la escala de su conjunto de datos.

5

ANTS Memory Profiler perfila el consumo de memoria del código .NET. He tenido excelentes resultados con esto en el pasado.

Cuestiones relacionadas