Утечка памяти / Форма не собирает мусор - PullRequest
0 голосов
/ 12 ноября 2009

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

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

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

Пространство имен C1 взято из ComponentOne.

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

Ant's Reference Graph

Ответы [ 3 ]

2 голосов
/ 12 ноября 2009

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

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

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

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

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

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

1 голос
/ 12 ноября 2009

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

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

0 голосов
/ 12 ноября 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();
    }
...