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

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

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

TestClass tc = new TestClass();

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

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

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

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

StayOnTarget 14.11.2018 18:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
15
1
12 736
3

Ответы 3

У меня хороший опыт работы с 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 положить что-то некоторое время назад вместе подробно рассказывала, как использовать профилировщик.

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

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

Другие вопросы по теме