Узнайте, сколько памяти используется объектом в С#?

Кто-нибудь знает способ узнать, сколько памяти занимает экземпляр объекта?

Например, если у меня есть экземпляр следующего объекта:

TestClass tc = new TestClass();

Есть ли способ узнать, сколько памяти занимает экземпляр tc?

Причина для запроса заключается в том, что хотя С# имеет встроенное управление памятью, я часто сталкиваюсь с проблемами, не очищая экземпляр объекта (например, List, который отслеживает что-то).

Есть несколько достаточно хороших профилей памяти (например, ANTS Profiler), но в многопоточной среде довольно сложно понять, что принадлежит там, даже с этими инструментами.

Ответ 1

Если вы не пытаетесь сделать это в самом коде, который я предполагаю на основе вашей ссылки 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.)

Ответ 2

CLR Profiler, который бесплатно предоставляется Microsoft, делает очень хорошую работу в этом деле.

Введение в весь профайлер можно скачать здесь. Также команда "Шаблоны и практики" помещала что-то вместе, подробно описывая, как использовать профилировщик.

Он выполняет довольно разумную работу, показывая вам разные потоки и объекты, созданные в этих потоках.

Надеюсь, что это проливает некоторый свет. Счастливое профилирование!

Ответ 3

У меня есть хорошие впечатления от MemProfiler. Он дает вам стековые следы, когда объект был создан, и все графики того, почему объект по-прежнему не собирают мусор.