Узнайте, сколько памяти используется объектом в C #? - PullRequest
13 голосов
/ 14 сентября 2008

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

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

TestClass tc = new TestClass();

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

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

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

Ответы [ 3 ]

7 голосов
/ 14 сентября 2008

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

3 голосов
/ 14 сентября 2008

CLR Profiler , предоставляемый Microsoft бесплатно, отлично справляется с подобными задачами.

Ознакомление со всем профилировщиком можно скачать здесь . Также команда Patterns & Practices собрала что-то некоторое время назад, подробно рассказывая, как использовать профилировщик.

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

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

2 голосов
/ 14 сентября 2008

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

...