Как найти память, используемую каждым объектом в программе?

Как мне узнать о памяти, используемой каждым объектом в программе?

Например: я хочу знать, сколько памяти (в килобайтах) используется этим объектом someclassinstance ..

someclass someclassinstance = новый someclass ();

Я могу увидеть общий объем памяти, используемый приложением, в диспетчере задач ... Но есть ли способ просмотреть подробный отчет об использовании памяти для каждого экземпляра объекта?

Примечание: Я пробовал профилировщик CLR .. но он показывает только общую память, используемую строками, насколько я знаю ... Он не показывает память, используемую каждым строковым объектом.

Спасибо


person Josh    schedule 28.04.2009    source источник
comment
Связано: http://stackoverflow.com/questions/426396/how-much-memory-does-ac-net-object-use   -  person Phaedrus    schedule 28.04.2009


Ответы (5)


Профилировщик CLR бесплатно и может это сделать. Он требует обучения, но поставляется с необходимой документацией.

person scottm    schedule 28.04.2009

.NET Memory Profiler превосходен. Он имеет 14-дневную пробную версию и после этого стоит довольно дешево. Он позволяет отслеживать все имеющиеся у вас экземпляры, составлять их график и видеть, сколько памяти занимает каждый из них. Это дает вам огромное представление о том, что именно происходит в вашем приложении.

person JP Alioto    schedule 28.04.2009

Red Gate Software делает Ants Profiler, который, я считаю, предоставит вам информацию вы хотите. Это определенно платно, но есть 15-дневная пробная версия, и в зависимости от того, достаточно ли вам повезло, что у вас есть бюджет на программное обеспечение на работе, вы сможете его купить.

person Mykroft    schedule 28.04.2009

Выделенная память монтируется для округления new someclass is sizeof (someclass) в большую сторону; округление, вероятно, будет чем-то вроде sizeof (someclass) + sizeof (void *) с округлением до 32.

Это не скажет вам, какую память, если таковая имеется, выделяет для своих членов.

Лучший способ сделать это - заменить глобальный оператор new на оболочку, которая записывает выделенные байты. Обратите внимание, что, как упоминалось выше, запрошенные байты меньше фактически выделенных байтов по причинам бухгалтерского учета и выравнивания.

Это можно сделать на C ++, насчет C # не знаю.

person tpdi    schedule 28.04.2009

Бесплатный, чрезвычайно мощный и довольно сложный способ сделать это с помощью Windbg + SOS < / а>

Этого сообщения в блоге должно быть достаточно, чтобы вы начали .

person Sam Saffron    schedule 28.04.2009
comment
Но, пожалуйста, объясните, как или укажите мне ссылку, где это объяснено ... Спасибо - person Josh; 28.04.2009