Zum Inhalt springen

VB.net Recyceling von Objekten


Lsteinme

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von lbm1305
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...