c# memory memory-management

C#: uso de memoria de un objeto



memory memory-management (4)

¿Has probado CLR Profiler 2.0?

¿Hay alguna manera de encontrar cuánta memoria se usa 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.


Realmente tendría que definir exactamente lo que quiere decir con "cuánta memoria se usa 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 lo 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); }

¿ nonInternedStrings realmente ocupa más memoria que internedStrings ? Si internedStrings fuera basura, no liberaría tanta memoria, pero si internedStrings nunca se hubiera creado (incluso sin internar cada uno de sus elementos), entonces nunca se habría requerido más memoria.

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


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


Esto parece ser un hermano de esta pregunta Delphi . 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.