Lsteinme Geschrieben 3. April 2013 Teilen Geschrieben 3. April 2013 Hallo Leute, ich hab mal wieder ein Problem, und weis nicht woran es liegt bzw wie ich es löschen soll Folgendes: Ich clone zu beginn eines Methodenaufrufs eine Datatable (weil ich sie als Source für nen DGV brauche). das dumm ist nur wenn ich den Clone später nicht mehr brauche, wird er nicht beseitigt, sonst bleibt im speicher (richtig schön im Arbeitsspeicher zu sehen, der wächst immer um circa 5MB an was schon ordentlich is (ka warum der clone so viel speicher braucht) das komische ist halt, nach dem ich den clone nicht mehr brauche, rufe ich sogar explict GC.collect auf, es tut sich aber nix, der Speicherverbaucht wächst weiter an. wer weiß rat? hier kurz ein Ausschnitt aus dem Code: dtclone = dtProjects.Clone Dim Rows As IEnumerable(Of Projekt) = Projekt_Dictionary.Values Me.DataSource = dtclone dtProjects.Clear() If (Not IsNothing(stateTypesColsSorted) AndAlso Not IsNothing(roleIdsColsSorted.Any)) Then For Each proj As Projekt In Rows dtProjects.Rows.Add(GetValuesForRows(proj)) Next End If Rows = FilterForText(dtProjects, Rows) Rows = FilterForActivProjects(Rows) Rows = FilterForEstimation(Rows) Rows = FilterForMyProjectsAndSubs(Rows) dtProjects.Clear() If (Not IsNothing(stateTypesColsSorted) AndAlso Not IsNothing(roleIdsColsSorted.Any)) Then For Each proj As Projekt In Rows dtProjects.Rows.Add(GetValuesForRows(proj)) Next End If Me.DataSource = dvProjects dtclone.Clear() dtclone = Nothing GC.Collect() Ohne das cloning wird mein DGV sehr träge, ich kann ihn aber auch nicht einfach über .suspendLayout ruhigstellen weil leider alles in diesem DGV abläuft (ist eine Abgeleitete Classe von einem MS-DGV), tu ich es doch, tuen meine filter nichtmehr was sie sollen. Die beiden For-Schleifen brauch ich, da beim eintritt, die datatable veraltet ist (es steht nur das drin was letztes mal nicht rausgeflogen ist). Leider braucht einer meiner Filter (der Textfilter) auch den DGV, weil er sich hier daten aus Sichtbarencolumns ziehen muss das könnte ich zwar auch (mit paar trichs) über die Datatable regeln, was ich auch versucht hab, aber die perfomance is dennoch nicht sehr gut weil der DGV zu oft zeichnet wenn er direkt die ganze zeit die richtige Datatable als Source hat. Kurz um: kann mir bitte jemand sagen warum in diesem Fall mein Arbeitsspeicher immer weiter anwächst, wenn ich ein objekt clone, später aber alle referenzen auf den Clone beseitige? hab ich vielleicht irgendwelche refernzen vergessen zu bedenken? ich weiß grad echt nicht weiter Gruß Lucas Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SilentDemise Geschrieben 3. April 2013 Teilen Geschrieben 3. April 2013 Ich würde die Finger vom GC lassen und lieber Dispose aufrufen ;-) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lbm1305 Geschrieben 3. April 2013 Teilen Geschrieben 3. April 2013 (bearbeitet) Nur weil die Garbage Collection aufrufst, heißt das nicht, dass das Objekt gleich aus dem Speicher entfernt wird. Das könnte interessant sein: Understanding .NET Garbage Collection Aber zwei Fragen noch: Warum brauchst Du den Klon? Was passiert auf dem Klon, was die Source-Table nicht erfahren darf? Bearbeitet 3. April 2013 von lbm1305 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lsteinme Geschrieben 4. April 2013 Autor Teilen Geschrieben 4. April 2013 Auf dem Clone passiert nix, das is der Trick bei der Sache, der Clone is nur eine temporäre kopie, damit mein DGV sich nicht während dem 2maligen säubern und befüllen der Datatable dauernt neu zeichnen will, das hat sehr (optisch) hässliche nebenwirkungen. Alles weitere läuft über die Orginaltabelle ab, deswegen wird die auch am ende wieder als Datasource gesetzt. Zum GC: ich hab mir den Artikel durchgelesen, sowie damals in meinem Unterricht zum Thema GC aufgepasst, dort steht auch: (grob übersetzt) das der GC alle jene Objekte einsammelt, die nicht mehr von einem aktiven primärelement der Anwendung verwende werden. Wenn ich also explizit den GC.collect aufrufe sollte der Collector doch eigentlich den Clone, so wie dessen Reihen und Cellen einsammeln, da diese keinerlei Referenzen auf die Hauptanwendung mehr haben dürften oder lieg ich da falsch und vergesse irgend eine spezielle referenz der geclonten Datatable zur Anwendung? Dispose kann ich hier nicht verwenden, weil die person die diesen DGV programmiert hat, sämmtliche Logik in selbigem belassen hat, heißt wenn ich den dispose, läuft garnix mehr^^ + Das dem Nutzer warscheinlich ein plötzlich leerer Raum auf dem Bildschrim auffallen würde, auch wenn dieser kurz darauf wieder besetzt ist. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
uenetz Geschrieben 4. April 2013 Teilen Geschrieben 4. April 2013 Der GC sagt nur, dass der zuvor benutzte Speicherbereich wieder verwendet werden kann. Ein explizite Löschen des besagten Speicherbereiches wird nicht vorgenommen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lsteinme Geschrieben 4. April 2013 Autor Teilen Geschrieben 4. April 2013 Achso, ok dann hab ich den GC wohl etwas falsch verstanden, ebenso wie den Artikel den lbm gepostet hat, dort stand ja auch "discards the elemtents" was für mich wegwerfen heißt^^ dann bleibt aber immernoch die frage warum der Arbeitsspeicher dann immer weiter anwächst, eigentlich sollten dann ja da (laut Artikel von lbm) lücken entstehen, wie gesagt die objekte sind zwischen 2,5 und 5 MB groß, nur werden diese Lücken augenscheinlich nie wieder gefüllt sondern es wird nur oben drauf gepackt, indiz: der Speicherverbrauch nimmt nie ab^^ Andere Seitenfrage: Kann man den den LOH eigentlich irgendwie dazu zwingen bestehende Lücken zu schließen? EDIT: Ok Problem gelöst, dispose hilft doch, muss es nur an der richtigen stelle anstetzen, nämlich am clone selbst nicht am DGV^^ Ich hab immer gedacht die dispose methode gäbe es nur bei Grafischen Componenten wie Label DGV und co, danke Silent Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SilentDemise Geschrieben 4. April 2013 Teilen Geschrieben 4. April 2013 vom dgv hatte ich ja auch nichts gesagt Du kannst statt des expliziten aufrufs übrigens auch ein using statement drumsetzen ;-) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lsteinme Geschrieben 4. April 2013 Autor Teilen Geschrieben 4. April 2013 ok Kommando zurück geht doch nicht, hatte vergessen einige auskomentierte staments wieder rein zu nehmen die aber für die Perfomance wichtig sind. Eine intresse Beobachtung ist aber, wahr ein Clone einmal datasource für den DGV wird er nicht mehr gelöscht, entferne ich die entsprechende beiden Zeilen (zuweisung des Clones als DataSource und zuweisung des Orginals (was nun aktuallisiert ist) als Datasource) aus dem auszführenden Code, wird der Platz den der Clone braucht irgendwann wiederverwertet. sind die beiden Zeilen aber drin, wird der Platz vom Clone nie wiederverwertet, kann es sein das die Datasource Methode vom DGV irgendwelche Logs aufbaut in denen all ihre Datasources gespeichert werden? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.