Freigabe von Speicher in Fensterapplikation

30/08/2007 - 17:02 von ktsoftie | Report spam
Ich habe das Problem, daß bei C#-Applikationen der Speicherbedarf beim
Arbeiten kontinuierlich anwàchst. Ich habe daraufhin ein Testprogramm
erstellt, das einen Dialog mit 100 Editboxen anzeigt. Auf Knopfdruck wird der
Dialog mir Hide() beendet und anschließend im Hauptprogramm mit Dispose()
aufgeràumt. Trotzdem wird der Speicher NICHT freigegeben, sondern im
Gegenteil nach mehreren Aufrufen benötigt das Programm immer mehr Speicher!
Aufrufe von GC.Collect() oder Aufrufe von Dispose der Elemente in der
Controls-Collektion bringen keine Verbesserung!

Mache ich etwas grundlegend falsch - oder benötigt VS2005 einfach eine
"gewisse" Speichermenge? Da unsere Applikation auf einem Termianlserver in
mehrere Sitzungen über Monate laufen soll, stellt das bereits nach wenigen
Tagen ein Problem dar (Rechner wird langsam und stürzt spàter ab). Soweit ich
verstanden habe, müssen in Dispose() nur Handles geschlossen werden, aber
keine verwalteten Objekte freigegeben werden - wie auch. Auf null setzen,
heißt ja auch nicht, daß die Objekte unmittelbar gelöscht erden.
 

Lesen sie die antworten

#1 Thomas Scheidegger [MVP]
30/08/2007 - 23:43 | Warnen spam
Hallo

Ich habe das Problem, daß bei C#-Applikationen der Speicherbedarf beim
Arbeiten kontinuierlich anwàchst. Ich habe daraufhin ein Testprogramm
erstellt, das einen Dialog mit 100 Editboxen anzeigt. Auf Knopfdruck wird der
Dialog mir Hide() beendet und anschließend im Hauptprogramm mit Dispose()
aufgeràumt. Trotzdem wird der Speicher NICHT freigegeben, sondern im
Gegenteil nach mehreren Aufrufen benötigt das Programm immer mehr Speicher!




ein Release-Build _ausserhalb_ vom (beendeten) Studio?

Wieviel Speicher?
Eine gute Verdoppelung (von Anfangs zB 20MB auf 40..50MB) ist da typisch und noch völlig 'problemlos'.
Erst wenn es grob > 3x mehr wird, stetig zunimmt und nie zurückgeht ist Analyse angesagt, etwa
http://www.microsoft.com/downloads/...x?familyid£62781c-3870-43be-8926-862b40aa0cd0&displaylang=en


Dialog mir Hide() beendet



und da mit Close()?

Wird Aufruf-Schema wie
DialogXYZ dlg = new DialogXYZ()
dlg.ShowDialog()
dlg.Dispose()
eingehalten?

Korrektes Exception-Handling an kritischen/fraglichen Stellen?

Wenn es wirklich auch bei _minimal_-Testprojekt aufritt,
mal auf anderem (fresh&clean) PC testen,
oder ggf uns Demo-Projekt in ZIP zum Download zur Verfügung stellen.



Thomas Scheidegger - MVP .NET - 'NETMaster'
http://www.cetus-links.org/oo_dotnet.html - http://dnetmaster.net/

Ähnliche fragen