Утечка памяти / форма не собираются сборщиком мусора

Я отслеживаю утечку памяти в приложении MDI. Открытие, а затем закрытие формы приводит к тому, что форма остается в памяти. Используя профилировщик памяти Ant, я могу получить следующий график ссылок, сохраняющих форму в памяти.

Я удалил все события, которые мы прикрепляем к комбинированным элементам управления, когда Dispose запускается в форме.

Может ли кто-нибудь направить меня к решению?

Пространство имен C1 происходит от ComponentOne.

Я должен отметить, что я попытался увидеть, какие методы c, r, b и т. Д. В элементе управления C1Combo, через отражатель, но, очевидно, был запущен через обфустикатор, что затрудняет понимание.

Контрольный график муравья


person Gregory    schedule 12.11.2009    source источник


Ответы (3)


Это напоминает мне огромное приложение C # WinForm, которое я построил на .NET 1.1 года назад. Я использовал .NET Memory Profiler, и он помог мне найти паразита. MP Ant, вероятно, сможет это сделать.

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

Не то чтобы я мог дать вам ответ напрямую, но если у вас были потоки, появляющиеся повсюду, внимательно наблюдайте / обрабатывайте их, особенно те вещи, которые в них выполняются.

В моем случае это скорее сохранение памяти, или хотя большинство будет утверждать, что это просто очередная утечка памяти.

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

Удачи в поисках виновника утечки!

person o.k.w    schedule 12.11.2009

C1 может иметь ошибку, не выпуская внутреннюю ссылку. Свяжитесь с компанией или выполните поиск в их базе знаний.

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

person John K    schedule 12.11.2009

Отследил это до внутренней ссылки на элементы управления в C1Combo. Есть список, в котором почему-то есть ссылки на формы и еще кое-что. В Dispose () формы я вызываю эту функцию для каждого элемента управления C1Combo. Понятия не имею о последствиях, скорее всего, минимальных, поскольку элемент управления в любом случае следует удалить.

Это также очень хрупко, как если бы они выпускали новую версию, и обфустикация испортила все имена методов / полей, она сломается.

private void RemoveInternalC1ComboReferenceListHack(C1Combo combo)
    {
        var result = typeof(C1Combo).GetField("_dropDownList", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(combo);
        var result2 = result.GetType().GetField("c", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(result);
        var result3 = result2.GetType().GetField("r", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(result2);
        var result4 = result3.GetType().GetField("b", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(result3);

        ((System.Collections.Generic.List<Control>)result4).Clear();
    }
person Gregory    schedule 12.11.2009