Speicherverbrauch steigt stetig

sTEk

Erfahrenes Mitglied

Ich habe derzeit das Problem, dass eines meiner Programme permanent mehr Speicher benötigt. Ich habe ein TabControl, dass auf jeder TabPage ein UserControl mit WebBrowser laufen lässt. Den WebBrowser durchsuche ich alle 200ms nach neuen Infos und speichere die gegebenenfalls (großteils in List<> Elemente) auch ab. Merkwürdig finde ich auch, dass der Speicherverbrauch selbst steigt, wenn im WebBrowser keine Seite annavigiert wurde.
Wenn ich nur zwei TabPages geöffnet habe belegt mein Programm nach 12 Stunden bereits gut 250MB im RAM. Wenn ich die TabPages per Remove entlade ändert sich komischerweise nichts am Speicher. Eigentlich sollten ja vom GC alle Variablen etc. korrekt entladen und der nicht mehr benötigte RAM freigegeben werden.
Wie kann ich das realisieren bzw. woher könnte dieses permanente "Wachstum" kommen?
Nebenbei muss ich noch sagen, dass das Programm stellenweise gut 50% (also einen kompletten Core) benötigt, jedoch erst, wenn ein WebBrowser auch navigiert...
 
Zuletzt bearbeitet:
Da scheinst du wohl irgendwo in deinem Programm Objekte zu instanziieren und nicht mehr freizugeben. Dann löscht der GC sie natürlich auch nicht.

Du kannst dir das mal mit dem CLR Profiler oder nem anderen .NET Memory Analyzer ansehen.

Aber von uns kann dir ohne Code sicher keiner weiter helfen. Kannst du den mal posten?
 
Hallo - Danke für den Tipp mit dem CLR (damit hab ich glatt unsinnig vergebene strings gefunden). Dazu mal eine Frage:
Zeigt der im Heap immer die aktuell geöffneten Objekte an? Wenn ja, wie kann es sein, dass ein UserForm geöffnet ist (incl. reichlich Speichplatz) wenn es doch mit "null" referenziert wurde?

Bei der CPU-Auslastung habe ich herausbekommen, dass der WebBrowser anscheinend nicht geschlossen wird - obwohl auch hier beim Beenden des jeweiligen Forms der WebBrowser sicherheitshalber mit "null" zugewiesen wird.
Via Wireshark sehe ich, dass die Kommunikation mit dem Server (also die Javascript-Elemente der - eigentlich ja geschlossenen - Website) immernoch am Gange ist. Auch ein WebBrowser.Stop() brachte nichts.

Wie kann das denn überhaupt passieren? Langsam verliere ich meinen Glauben in die null-Zuweisung...

Das mit dem Code posten ist in diesem Falle so eine Sache - das ist ziemlich viel in sehr vielen Funktionen, von daher äußerst schwierig "übersichtlich" zu präsentieren.
 
Die Zuweisung von null hat noch keinen Einfluss auf das Objekt. Aber wenn es von nirgendwo mehr referenziert wird, dann wird der GC es löschen. Die Frage ist nur wann, dass kann man nicht genau sagen.

Im Heap sind alle aktuell vorhandenen Objekte. Also auch die, die keiner mehr braucht, bis sie vom GC vernichtet werden.

Versuche, wie gesagt, Dispose aufzurufen. Wenn du an einer Stelle wirklich viele Objekte instanziierst, die danach sofort nicht mehr benötigt werden, kannst du auch mal GC.Collect() aufrufen, das sagt dem GC, das er nicht mehr benötigte Objekte löschen soll. Das aber bitte wirklich nur in Ausnahmesituationen, weil der GC wirklich nicht schnell ist und das dein Programm extrem verlangsamen kann.
 

Neue Beiträge

Zurück