Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problem sa Memory Usage applikacije

[es] :: .NET :: Problem sa Memory Usage applikacije

Strane: 1 2

[ Pregleda: 4618 | Odgovora: 34 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Problem sa Memory Usage applikacije13.06.2009. u 19:28 - pre 180 meseci
ok, nismo se razumeli ali nije ni vazno jer sam se snasao za pocetak. Za ubuduce, kad profilujes aplikaciju to radis u okviru jedne sesije sa vise snapshotova, ne zasebna sesija za svaki snapshot jer onda ne mozes da poredis snapshote i otezana je analiza jer ne moze da se eliminise ono sto je vec postojalo (delta nije dobar). Isto kad sam rekao gen0 snapshot to je znacilo da i prvi i drugi snapshot budu preko onog dugmeta sa Gen0 (pored ovog koje pritiskas), ne da kreiras poseban gen0 snapshot, to dugme samo znaci da prvo uradi gen0 kolekciju i onda tek da uradi snapshot, sto vodi ka smanjenju suma a i velicine session fajla.

Elem,

tvoja muka lezi u krypton buttonu defintiivno, pronasao sam 8000 instanci dugmica, oni sami po sebi nisu toliki problem (managed data je manje od 2 mb) ali posto za svaki ucitavas sliku onda to vuce unamanaged GDI resurse koje medjutim nisi ukljucio u analizu pa ne mogu da vidim da li je to zasluzno za raspad sistema.
Sad treba da uradis sledece. Ubaci dispose u igru, pre nego ti stari dugmici odu iz scope-a disposuj ih (vidim u logu da nisu disposovani) i uradi jos jednu sesiju sa dva snapshota (posle starta, i posle maltertiranja) i daj mi fajl, ali sad podesi ove opcije u session wizardu:

- dispose tracker - YES
- real time - NO
- instance data - NO
- heap utilization - YES
- unmanaged resource tracker - YES

to ce malo i ograniciti sesson file a dace informacije koje trebaju, znaci oba snapshota u okviru iste sesije, please.


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

CallMeSaMaster

Član broj: 43611
Poruke: 466
92.36.132.*



+1 Profil

icon Re: Problem sa Memory Usage applikacije13.06.2009. u 23:40 - pre 180 meseci
Pozdrav,

nazalost ima jedan mali problem sa tim dispose-om:Ako pogledas code koji sam na pocetku teme post-o,
primjetit ces sledece:

Code:

        For Each row As DataRow In ds.Tables("Jedinice").Rows

            i = i + 1

            btn(i) = New KryptonButton
            btn(i).Text = row(1).ToString
            btn(i).StateCommon.Content.ShortText.TextH = PaletteRelativeAlign.Far
            btn(i).ForeColor = Color.White
            btn(i).Tag = row(0)

            btn(i).Name = "Button" + i.ToString()
            btn(i).Size = New Size(178, 68)
            btn(i).StateCommon.Content.ShortText.Font = New Font("Ariel", 9, 
                        System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point)
            btn(i).Values.Image = Image.FromFile(url + row(4))
            btn(i).StateCommon.Content.Image.ImageH = PaletteRelativeAlign.Near
            btn(i).PaletteMode = PaletteMode.SparkleBlue
            btn(i).ButtonStyle = ButtonStyle.Standalone

            TableLayoutPanel3.Controls.Add(btn(i))
            TableLayoutPanel3.AutoSize = True

            AddHandler btn(i).Click, AddressOf Me.btnArray1Click
        Next



Kao sto vidis, dinamicki se dodaje handler za svaki button. Eh sada, nisam bas siguran ako da uklonim handler za btn(i), jer nemam to "i".
Dispose bih radio na izlazu sa forme, ali nazalost,
iako nisam probo, siguran sam da ce compiler javiti error jer ne zna sta je to "i".
Iskreno ni ja ne znam kako da ga dispose, jer ako stavim ovako, past ce...

Code:

RemoveHandler btn(i).Click, AddressOf Me.btnArray1Click


Kako da ga dispose???

[Ovu poruku je menjao mmix dana 14.06.2009. u 01:08 GMT+1]
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Problem sa Memory Usage applikacije14.06.2009. u 00:32 - pre 180 meseci
Vrlo prosto, tamo gde ih inace izbacujes iz scope-a, a to je tamo gde pozivas TableLayoutPanel3.Controls.Clear(), samo sto mene ne interesuje removehandler, Eventhandler instanca koju kreiras sa AddHandler je ciklicna (pripada button-u na koji pokazuje), tako da kad cleanup pokupi button pokupice i taj event handler, ako bas hocs da budes koser mozes da dodas i removehandler, ali mislim da to nije presudno, vazniji je dispose.

samo sto izgleda na osnovu logova da kryptonbutton dodatno kreira evente u nekim svojim internim strukturama koje zive duze od dugmeta i da te reference sprecavaju cleanup nakon sto nullujes svoj pointer, sto pretpostavljam da ce button.dispose da resi. Posto ta event invocation lista pripada svom posebnom GC rootpath-u ne mogu da znam dal nesto drzi objekat u zivotu legalno ili bagovito pre nego sto uradis dispose, verovao ili ne tvoj jedan button pripada 22 razlicitih rootpath-ova, tj nalazi se u 22 razlicite GC strukture, sto je malo mnogo bar po nekom mom iskustvu, treba sve to pocistiti (al to nije tvoj problem, vec onog ko je pisao krypton). Tek kad button uradi svoj cleanup mogu da vidim da li je neki root-path preostao ili su svi nullovani i objekat je otisao na kolekciju.

Dakle ubaci sledeci kod umesto TableLayoutPanel3.Controls.Clear()

Code:

For Each c in TableLayoutPanel3.Controls
   c.Dispose()
Next
TableLayoutPanel3.Controls.Clear()


ovo predvidja da u TableLayoutPanel3 drzis samo dugmice....
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

vbbojan
Atanasijevic Bojan
Digit Consulting d.o.o.
Beograd

Član broj: 31580
Poruke: 273
93.93.194.*

Sajt: www.digitconsulting.rs


+20 Profil

icon Re: Problem sa Memory Usage applikacije14.06.2009. u 00:40 - pre 180 meseci
Uf! Ajd' ovako, array ti i ne treba ...

Code:

       Dim btn as KryptonButton
       Dim i as integer = 0

       For Each row As DataRow In ds.Tables("Jedinice").Rows

           i += 1

           btn = New KryptonButton
           btn.Text = row(1).ToString
           btn.StateCommon.Content.ShortText.TextH = PaletteRelativeAlign.Far
           btn.ForeColor = Color.White
           btn.Tag = row(0)

           btn.Name = "Button" + i.ToString()
           btn.Size = New Size(178, 68)
           btn.StateCommon.Content.ShortText.Font = New Font("Ariel", 9, 
                       System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point)
           btn.Values.Image = Image.FromFile(url + row(4))
           btn.StateCommon.Content.Image.ImageH = PaletteRelativeAlign.Near
           btn.PaletteMode = PaletteMode.SparkleBlue
           btn.ButtonStyle = ButtonStyle.Standalone

           TableLayoutPanel3.Controls.Add(btn)
           TableLayoutPanel3.AutoSize = True

           AddHandler btn.Click, AddressOf Me.btnArray1Click

        Next


Da pocistis za sobom, recimo ovako (ideju si mogao dobiti već iz posta sa početka teme):

Code:


       Dim kb as KryptonButton

       For Each ctrl in TableLayoutPanel3.Controls

           If TypeOf ctrl Is KryptonButton then
               kb = CType(ctrl, KryptonButton)
               RemoveHandler kb.Click, AddressOf Me.btnArray1Click
               TableLayoutPanel3.Controls.Remove(kb)
               kb.Dispose
           End If

        Next



Pozdrav

Edit, malo zakasnih ...
 
Odgovor na temu

CallMeSaMaster

Član broj: 43611
Poruke: 466
92.36.129.*



+1 Profil

icon Re: Problem sa Memory Usage applikacije14.06.2009. u 09:05 - pre 180 meseci
Pozz,

evo napravio sam dva snapshota Gen0 sa dispose kao sto ste opisali.

http://rs428.rapidshare.com/files/244345831/Session_4.rar

Nazalost nista se nije promijenilo.

Da li bi recmi pomoglo ako bi ja negdje upload demo aplikacije pa da pogledate?

 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Problem sa Memory Usage applikacije14.06.2009. u 14:32 - pre 180 meseci
Nije se nista promenilo zato sto nista nisi dispose-ovao, pogledaj sliku i videces da je dispose kolona prazna, sto znaci da nijedan od dinamicki kreiranih dugmica nije dispose-ovan; da nemas jos negde TableLayoutPanel3.Controls.Clear()? Ta kolekcija ne sme da se prazni sa Clear() bez da se elementi disposuju prvo, to je obavezno u tvom slucaju jer na nivou aplikacije postoji root instanca klase KryptonManager koja drzi zivu instancu svih krypton kontrola na formi (koliko vidim zbog skinovanja) i mislim da je to rootpath koji sprecava autoamtsku finalizaciju buttona (na slici desno).


Dalje, tebe definitivno slike umlacuju, na kraju imas 16800 image objekta cije su bitmape lockovane u memoriju, tebi na kraju ne ponestane virtuelnog adresnog prostare vec mesta u fizickoj memoriji za smestanje slika (onih iz \program files\@Caffee\@Caffee\slike, npr balantine2.jpg, campari.jpg prednjace). To ce definitivno dispose da resi ako krypton nije bagovit.


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
Prikačeni fajlovi
 
Odgovor na temu

vbbojan
Atanasijevic Bojan
Digit Consulting d.o.o.
Beograd

Član broj: 31580
Poruke: 273
93.93.194.*

Sajt: www.digitconsulting.rs


+20 Profil

icon Re: Problem sa Memory Usage applikacije14.06.2009. u 19:17 - pre 180 meseci
Pazi kad me nije mrzelo da skinem Krypton Suite ... i da malo pogledam.
Prvo sto sam uocio je da sam te pogresno savetovao oko dispose buttona iz panela.

Naime, to ne radi kako treba, jer iterator prodje samo preko pola objekata u kolekciji,
sto se moze videti iz sledeceg:

Code:


        Dim ctrlprocessed As Integer = 0

        Debug.WriteLine("Broj kontrola u panelu pre ciscenja: " & Me.TableLayoutPanel1.Controls.Count.ToString)

        For Each ctrl In Me.TableLayoutPanel1.Controls

            ctrlprocessed += 1
            ctrl.Dispose()

        Next

        Debug.WriteLine("Broj kontrola kroz koje je prosla petlja: " & ctrlprocessed.ToString)
        Debug.WriteLine("Broj kontrola u panelu posle ciscenja: " & Me.TableLayoutPanel1.Controls.Count.ToString)



Sto ce reci, iteracija kroz kolekciju i promena broja elemenata iste, se ne zavrsava sretno.
Previd, sa moje strane, ali i dobar primer kako nesto sto na prvi pogled radi dobro u stvari i ne radi.

No, da bi stvarno prosli kroz kolekciju kontrola u panelu treba nam nesto na primer ovako:

Code:


        Dim ctrlprocessed As Integer = 0

        Debug.WriteLine("Broj kontrola u panelu pre ciscenja: " & Me.TableLayoutPanel1.Controls.Count.ToString)

        Dim ctrlArr As ArrayList = New ArrayList(Me.TableLayoutPanel1.Controls)

        For Each ctrl In ctrlArr

            ctrlprocessed += 1
            ctrl.Dispose()

        Next

        Debug.WriteLine("Broj kontrola kroz koje je prosla petlja: " & ctrlprocessed.ToString)
        Debug.WriteLine("Broj kontrola u panelu posle ciscenja: " & Me.TableLayoutPanel1.Controls.Count.ToString)


I sad konacno imamo metod koji stvarno radi dispose ... kako treba

Probaj ovako.

I da, ovoliki broj slika je stvarno problematican, ako je bas neophodno da ih bude ovoliko,
potrebno je optimalnije resenje.

Pozdrav i javi kako ide dalje


 
Odgovor na temu

CallMeSaMaster

Član broj: 43611
Poruke: 466
*.versanet.de.



+1 Profil

icon Re: Problem sa Memory Usage applikacije14.06.2009. u 21:07 - pre 180 meseci
@mmix

Hvala na analizi, sad sam gledao bez slika i niej toliko strasno. Ali moj problem je da jednostavno mroam imati sliku na buttonu.
Dali mozes da mi obajsnis koji je najbolji nacin odnosno gdje da cuvam te objekte(slike)? Da li mozda u bazi(koristim Sql Server 2005)?
Trenutno drzim na disku(znam da nije najbolja solucija, znao sam to i raniej ali se ni u snu nisam nadao da ce me toliko kostat)


@vbbojan

Hvala i tebi. To sto se samo pola kontrola dispose, sam i ja jutros primjetio. Nazalost nisam stigao napisati jer sam morao krenuti na put.
Sa novim kodom sam takodjer probao, radi dobro, memorija takodjer radi kako ocekujem. Medjutim kada u tablelayoutu radi dispose, sve mi treperi.Sto mi se nikako svidja. Imas li neki prijedlog? Probao sam da suspendujem layout pa da resume ali ne ide bas....
 
Odgovor na temu

Igor Gajic

Član broj: 93194
Poruke: 747
93.86.74.*



+987 Profil

icon Re: Problem sa Memory Usage applikacije14.06.2009. u 21:19 - pre 180 meseci
Nemoj ici kroz kolekciju sa ovom metodom:

Code:


        For Each ctrl In Me.TableLayoutPanel1.Controls

            ctrlprocessed += 1
            ctrl.Dispose()

        Next



idi sa ovom(C# ali mislim da ces se snaci):
Code:

while(this.TableLayoutPanel1.Controls.Count>0)
{
ctrlprocessed+=1;
TableLayoutPanel1.Controls[0].Dispose();
}


Razlog, modifikuje se kolekcija kada uradis Dispose() ali to uradi tiho i ne upozorava te.
 
Odgovor na temu

CallMeSaMaster

Član broj: 43611
Poruke: 466
*.versanet.de.



+1 Profil

icon Re: Problem sa Memory Usage applikacije14.06.2009. u 22:03 - pre 180 meseci
Pokusao, i opet isto. Treperi i dalje...
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Problem sa Memory Usage applikacije14.06.2009. u 22:09 - pre 180 meseci
@Igor, u pravu si, i ja sam zaboravio na ovaj idiotizam Control objekta, ako su vec toliko prekrsili sopstvenu semantiku onda su bar mogli da stave neki fleg u Clear metod pa da ti parent disposeuje kontrole ako hoces. Ima tu mnogo nelogicnosti.

@CallMeSaMaster:

slike mozes i da kesiras pa da kloniras po potrebi, dobices na brzini sto ne moras svaki put da ih ucitavas sa diska. Ali ti i dalje to ne reseava tvoj problem, dal ces klonirati bitmapu ili ces je ucitati sa diska ili ces je ucitati iz SQL-a opet zauzima memoriju jer GDI radi sa bitmapama u fizickoj memoriji, ako ne disposujes bitmap objekat GDI handle ce ostati zajedno sa bitmapom. Dispose ce osigurati da se u dispose lancu oslobodi i slika iz GDI-a.
form ti treperi zato sto dispose button-a poziva remove u TableLayoutPanel koji posle svake iteracije poziva repaint. Treba da koristis suspend layout na nivou forme, pre nego udjes u dispose petlju i da uradis resume na kraju kad je TableLayoutPanel ispraznjen i onda napunjen sa novim dugmicima (u prevodu, na pocetku i kraju btnClick metoda)

Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

CallMeSaMaster

Član broj: 43611
Poruke: 466
*.versanet.de.



+1 Profil

icon Re: Problem sa Memory Usage applikacije14.06.2009. u 22:21 - pre 180 meseci
Ok, sada radi to sa dispose, jer mi se memorija vrti oko jedne vrijednosti. Tako da tacno vidim da kada uradim dipose da se ista i oslobadja.

Nazalost, treperenje i dalje ostaje, da li suspend/resume bio na pocetku i karju ili bilo kako....
 
Odgovor na temu

vbbojan
Atanasijevic Bojan
Digit Consulting d.o.o.
Beograd

Član broj: 31580
Poruke: 273
93.93.194.*

Sajt: www.digitconsulting.rs


+20 Profil

icon Re: Problem sa Memory Usage applikacije15.06.2009. u 19:18 - pre 179 meseci
Ne mora da se radi za celu formu, mozes i na nivou samog panela.
Evo ti ideja, isto bi trebalo da uradis i kad dodajes kontrole u panel.


Code:


        Dim ctrlprocessed As Integer = 0

        Debug.WriteLine("Broj kontrola u panelu pre ciscenja: " & Me.TableLayoutPanel1.Controls.Count.ToString)

        Dim ctrlArr As ArrayList = New ArrayList(Me.TableLayoutPanel1.Controls)

        'OVDE!
        Me.TableLayoutPanel1.SuspendLayout

        For Each ctrl In ctrlArr

            ctrlprocessed += 1
            ctrl.Dispose()

        Next

        ' I OVDE!
        Me.TableLayoutPanel1.ResumeLayout

        Debug.WriteLine("Broj kontrola kroz koje je prosla petlja: " & ctrlprocessed.ToString)
        Debug.WriteLine("Broj kontrola u panelu posle ciscenja: " & Me.TableLayoutPanel1.Controls.Count.ToString)



 
Odgovor na temu

CallMeSaMaster

Član broj: 43611
Poruke: 466
*.versanet.de.



+1 Profil

icon Re: Problem sa Memory Usage applikacije15.06.2009. u 19:34 - pre 179 meseci
@vbbojan

Pokusao sve ali ne pomaze....Razmisljam da zamjenim tu kontrolu ali enmam bas puno izbora...
Stvarno ne kontam zasto se ovo desava...

 
Odgovor na temu

CallMeSaMaster

Član broj: 43611
Poruke: 466
*.versanet.de.



+1 Profil

icon Re: Problem sa Memory Usage applikacije15.06.2009. u 19:42 - pre 179 meseci
Ne znam zasto ali sad odjednom radi!
Stavio sam da se tokom dispose() tablelayoutpanel.visible = false
I to je radilo

Sada stavim suspend/resume i isto radi


Hvala vam velika svima na pomoci!
 
Odgovor na temu

[es] :: .NET :: Problem sa Memory Usage applikacije

Strane: 1 2

[ Pregleda: 4618 | Odgovora: 34 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.