Вопрос по winforms, c#-3.0 – Могу ли я получить экземпляры живых объектов определенного типа в C #?

3

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

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

Благодарю.

Ваш Ответ

2   ответа
1

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

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

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

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

0

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

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

Похожие вопросы