Кто-нибудь знает способ узнать, сколько памяти занимает экземпляр объекта?
Например, если у меня есть экземпляр следующего объекта:
TestClass tc = new TestClass();
Есть ли способ узнать, сколько памяти занимает экземпляр tc?
Причина, по которой я спрашиваю, заключается в том, что, хотя C# имеет встроенное управление памятью, я часто сталкиваюсь с проблемами, связанными с не очищением экземпляра объекта (например, списка, который что-то отслеживает).
Есть несколько достаточно хороших профилировщиков памяти (например, ANTS Profiler), но в многопоточной среде довольно сложно определить, что и где принадлежит, даже с этими инструментами.





У меня хороший опыт работы с MemProfiler. Он дает вам стековые трассировки того, когда объект был создан, и все графики того, почему объект по-прежнему не сборщик мусора.
Если вы не пытаетесь сделать это в самом коде, что, как я предполагаю, основано на вашем справочнике ANTS, попробуйте взглянуть на CLRProfiler (в настоящее время v2.0). Это бесплатно, и если вы не возражаете против довольно упрощенного пользовательского интерфейса, он может предоставить ценную информацию. Это даст вам подробный обзор всех видов статистики. Некоторое время назад я использовал его как один из инструментов для поиска утечки памяти.
Скачать здесь: http://www.microsoft.com/downloads/details.aspx?FamilyId=A362781C-3870-43BE-8926-862B40AA0CD0&displaylang=en
Если вы действительно хотите сделать это в коде, в CLR есть API-интерфейсы профилирования, которые вы могли бы использовать. Если вы найдете информацию в CLRProfiler, поскольку он использует эти API, вы также сможете сделать это в коде. Больше информации здесь: http://msdn.microsoft.com/de-de/magazine/cc300553(en-us).aspx
(Это не так загадочно, как при использовании WinDbg, но будьте готовы к серьезным действиям в среде CLR.)
Профилировщик CLR, который бесплатно предоставляется Microsoft, очень хорошо справляется с этой задачей.
Введение в профилировщик в целом можно скачать здесь. Также команда Patterns & Practices положить что-то некоторое время назад вместе подробно рассказывала, как использовать профилировщик.
Он делает довольно разумную работу, показывая вам различные потоки и объекты, созданные в этих потоках.
Надеюсь, это проливает свет. Удачного профилирования!
Возможный дубликат Как получить размер объекта в памяти?