Изтичане на памет/формулярът не се събира

Проследявам изтичане на памет в 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 и момчето ми помогна да намеря паразита. Ant's MP вероятно може да го направи.

Както и да е, в моя случай имах много паралелни нишки и таймери, създадени по време на употребата. Оказа се, че виновникът е инстанция на таймер, която никога не е била изхвърлена правилно и следователно никога не е приключила породената нишка, от която работи таймерът.

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

В моя случай това е по-скоро задържане на паметта или въпреки че повечето ще твърдят, че е просто поредното изтичане на памет.

Ако източникът на проблема идва от компонент на трета страна, предполагам, че трябва да ги преследвате.

Успех в преследването на виновника за теча!

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