Могу ли я получить экземпляры живых объектов определенного типа в C #?

Это вопрос C # 3.0. Могу ли я использовать классы отражения или управления памятью, предоставляемые .net framework, для подсчета общего числа живых экземпляров определенного типа в памяти?

Я могу сделать то же самое, используя профилировщик памяти, но это требует дополнительного времени для сброса памяти и требует стороннего программного обеспечения. Мне нужен только мониторинг определенного типа, и я хочу легкий метод, который может легко перейти к юнит-тестам. Целью подсчета живых экземпляров является обеспечение того, чтобы у меня не было ожидаемых живых экземпляров, которые вызывают "утечку памяти".

Благодарю.

Ответы на вопрос(2)

вы могли бы создать счетчик экземпляров, но его нужно было бы явно кодировать и управлять внутри каждого класса - я не знаю никакой серебряной пули, которая позволила бы вам запрашивать структуру изнутри выполнение кода, чтобы увидеть, сколько экземпляров живы.

То, о чем ты просишь, - это действительно область профилировщика. Вы можете приобрести один или создать свой собственный, но это требует, чтобы ваше приложение запускалось как дочерний процесс профилировщика. Между прочим, кататься по-своему нелегко.

Если вы хотите рассмотреть счетчик экземпляров, это должно быть что-то вроде:

public class MyClass : IDisposable
    public MyClass()
    {
        ++ClassInstances;
    }

    public void Dispose()
    {
        --ClassInstances;
    }

    private static new object _ClassInstancesLock;
    private static int _ClassInstances;
    private static int ClassInstances
    {
        get
        {
            lock (_ClassInstancesLock)
            {
                return _ClassInstances
            }
        }
    }

Это просто грубый пример, никаких тестов для компиляции; 0-процентная гарантия безопасности потока (критично для этого типа подхода) и оставляет дверь широко открытой для вызова Dispose, экземпляра в счетчик декремента, но для объекта не для правильного GC. Чтобы диагностировать этот набор радости, вам понадобится, как вы уже догадались, профессиональный профилировщик - или, по крайней мере, windbg.

Редактировать Я только что заметил последнюю строчку вашего вопроса и хотел сказать, что мой вышеупомянутый подход, столь же дрянной и склонный к сбоям, почти гарантированно обманет и обманет вас по поводу истинного количества случаев, если вы испытываете утечка. Лучший инструмент IMO для решения этих проблем - ANTS Memory Profiler. Версия 5 представляет собой двойное преимущество в том смысле, что они разбили профилировщик производительности и памяти на два отдельных SKU (раньше их объединяли), но Memory Profiler 5.0 абсолютно молниеносно. Профилирование этих проблем раньше было медленным, как молазой, но они обошли его где-нибудь.

Если это не относится к личному проекту с 0 намерением перераспределения, вы должны инвестировать несколько сотен долларов, необходимых для ANTS, но во всех случаях сначала используйте пробный период. Это отличный инструмент дляв точк этот вид анализа.

ля использованияCLR Profiling API для отслеживания времени жизни объекта. Мне неизвестно о каких-либо API-интерфейсах, доступных для управляемого кода, чтобы делать то же самое, и, насколько я знаю, CLR нигде не хранит список живых объектов (поэтому даже при использовании API-профилировщика вы должны создавать данные структуры для этого сами).

@ VB.NET есть функция, позволяющая отслеживать объекты в отладчике, но на самом деле она генерирует дополнительный код специально для этого (который в основном регистрирует все созданные объекты во внутреннем списке слабых ссылок). Вы также можете сделать это, например, используя PostSharp для постобработки ваших сборок.

Ваш ответ на вопрос