Узнайте, сколько памяти используется объектом в С#?
Кто-нибудь знает способ узнать, сколько памяти занимает экземпляр объекта?
Например, если у меня есть экземпляр следующего объекта:
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. Он дает вам стековые следы, когда объект был создан, и все графики того, почему объект по-прежнему не собирают мусор.