[VB.NET] Geheugen gebruik

Pagina: 1
Acties:

Onderwerpen


  • Voois
  • Registratie: Augustus 2006
  • Laatst online: 02-02 22:15
Beste tweaker,

Tijdens het ontwikkelen van mijn applicatie loop ik tegen een probleem aan met het gebruik van geheugen.

Bij de startup gebruikt mijn app ong 15 mb geheugen. Dat is al best veel voor een lege form met slechts 1 button en 1 afbeelding maar goed prima.
Als ik vervolgens op de button klik wordt er een nieuwe form geopend met dezelfde afbeelding. Er komt een paar MB aan geheugen bij, das logisch, maar als ik die form weer sluit, dispose en close , dan wordt het geheugen niet vrij gegeven. Dit is opzich een bekend probleem met Vista / Win7 en deels op te lossen met de GC.collect. Maar voor ons nog niet voldoende.

Als je in het voorbeeld de form een aantal keer opent / sluit blijft het geheugen aardig oplopen. En soms slechts een deel terug gegeven. Nu is dit in het voorbeeld nog wel te doen omdat het toch 'maar' onder de 100mb blijft.
Echter in mijn app open / sluit ik meerdere forms met grote datasets. Het geheugen gebruik kan dan al snel oplopen tot 1 GB. Maar aangezien het op een terminal server draait en er 20 gebruikers mee werken kun je je vast voorstellen dat met een geheugen gebruik van pak en beet 14 GB van de 16GB het niet altijd ff prettig en soepel blijft lopen.

Misschien is het allemaal wat vaag omschreven dus vandaar dat je *weg* het voorbeeld kunt downloaden zodat het wellicht duidelijker word. Als je geen Visual studio bij de hand hebt staat in de bin.debug map een exe.

Ik hoop dat er iemand een oplossing heeft voor dit probleem.

Alvast ontzettend bedankt!!!

[ Voor 1% gewijzigd door RobIII op 26-11-2009 13:36 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Euh; we gaan hier niet voor je zitten debuggen. Dat mag je zelf doen. Het is dan ook niet de bedoeling dat je je source online plempt en wij wel even het probleem voor je gaan aanwijzen.

We zien hier graag wat je al hebt geprobeerd (behalve GC.Collect) en enkel (relevante!) delen code waarvan je denkt dat ze (onderdeel van) het probleem zijn.

[ Voor 30% gewijzigd door RobIII op 26-11-2009 13:40 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Voois
  • Registratie: Augustus 2006
  • Laatst online: 02-02 22:15
ik vraag ook niemand om te debuggen hoor.
Maar voor degene die willen zien wat ik bedoel met het lekken van het geheugen heb ik een voorbeeldje gemaakt.

De enige code die er in feite zelf in gezet is is deze:

FORM 1:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim frm As New Form2
frm.Show()
'frm.Dispose() maakt geen verschil
End Sub

FORM2:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Me.Dispose() maakt geen verschil.
Me.Close()

End Sub

Niet echt interessante code dus persoonlijk ben ik van mening dat het voorbeeldje wel degelijk kan bijdragen in het verduidelijken van het probleem.
Dus nogmaals hier het voorbeeld: *weer weg*
Indien je het er niet mee eens bent dan moet je het maar weer even weghalen.

[ Voor 2% gewijzigd door NMe op 26-11-2009 14:50 ]


  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

Als je je form disposed nog voor je hem sluit krijg je dan echt geen errors :?. Sowieso ga je inderdaad geen geheugen vrijmaken aangezien hij de forms in beide gevallen niet KAN disposen.

Dispose gebeurt nadat je hem sluit en zou al automatisch moeten gebeuren.

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


  • Voois
  • Registratie: Augustus 2006
  • Laatst online: 02-02 22:15
Boeboe schreef op donderdag 26 november 2009 @ 14:04:
Als je je form disposed nog voor je hem sluit krijg je dan echt geen errors :?. Sowieso ga je inderdaad geen geheugen vrijmaken aangezien hij de forms in beide gevallen niet KAN disposen.

Dispose gebeurt nadat je hem sluit en zou al automatisch moeten gebeuren.
die staan ook uit gequote, heb ik ff laten staan om te laten zien dat ik ook geprobeerd heb direct te disposen na de show.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Voois schreef op donderdag 26 november 2009 @ 13:51:
Dus nogmaals hier het voorbeeld: *weer weg*
Dus nogmaals weggehaald. We zeggen niet voor niks dat het niet de bedoeling is dat wij je code gaan debuggen voor je. Je kan relevante code posten, en daarmee kunnen we je helpen. We gaan niet je complete project doorspitten om te kijken waar jouw fout zit. Zo werkt het hier gewoon niet.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • masterpoi
  • Registratie: Oktober 2004
  • Laatst online: 22-06 18:50
Heb even je form code 100000x in een loopje gestop en dan met .net memory profiler gekeken of er memory geleakt wordt. Resultaat zoals ik verwachtte: alle geheugen wordt weer vrijgegeven en blijft stabiel gedurende de test.

M.a.w. je memory leak moet dus elders vandaan komen. Met eender welke memory profiler (er zijn er drie goede voor zover ik weet Jetbrains dotTrace, Red ant en .net memory profiler) is dat eenvoudig te achterhalen.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16-09 11:22

gorgi_19

Kruimeltjes zijn weer op :9

* gorgi_19 vraagt zich af wat het probleem is met veel geheugengebruik? Daar heb je toch een GC voor? Wordt het geheugen niet geclaimd op het moment dat het weer nodig is?

[ Voor 24% gewijzigd door gorgi_19 op 26-11-2009 16:23 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Voois schreef op donderdag 26 november 2009 @ 13:30:
Beste tweaker,

Tijdens het ontwikkelen van mijn applicatie loop ik tegen een probleem aan met het gebruik van geheugen.

Bij de startup gebruikt mijn app ong 15 mb geheugen. D
Dit komt omdat bij het starten het .Net Framework wordt geladen, dit framwork is waarschijnlijk het grootste gedeelte van die 15MB, voor elk volgend form hoeft het framework niet meer geladen te worden. (Of iig niet de core).

Verder duurt het soms even voordat een form gegarbagecollect wordt, de GC kan het nog niet nodig vinden, of er kan nog ergens een referentie naar het (gesloten) form zijn waardoor deze (nog) niet opgeruimd kan worden. Verder is mij geen memory leak bug bekend in Vista / Windows 7 en ik werk bijna dagelijks aan WinForms applicaties op Windows 7 (betekend niet dat er niet 1 kan bestaan, maar lijkt me onwaarschijnlijk) :).

Ook is de taskmanager niet de betrouwbaarste plek om te kijken hoeveel geheugen een applicatie gebruikt, dit is slechts een indicatie, gebruik een profiler om er achter te komen wat er nu echt gebeurd :).

~ Mijn prog blog!


  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Als je een form closed / op null zet kan het zijn dat je nog een openstaande handle hebt naar een eventhandler (eventhandlers zijn geen function pointers!).

Dus je moet eerst dat event detachen, en dan het form disposen.

Ik zeg niet dat dat de oorzaak is, ik zeg dat dat een mogelijkheid is.

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • jp
  • Registratie: November 2000
  • Laatst online: 03-07 15:30

jp

Op (development) Terminal Server proberen situatie na te bootsen met 20+ gebruikers en grote forms? Wellicht dat de GC iets actiever wordt als er weinig geheugen meer vrij is...
Pagina: 1