Löscht Garbage Collector Objekte verspätet? C#

wenn ich ein object freigebe mit:

objekt.Dispose();
object = null;
GC.Collect:

…, dann weiß ich ja nicht wann der GC tatsächlich aufräumt.

Wenn ich das gleiche Objekt jetzt kurze Zeit später wieder benötige und dieses mit

object = new … erstelle, kann es dann passieren, dass mir der GC das neu erstellte Objekt irgendwann löscht, weil ich es zuvor unter dem gleichen Namen freigegeben habe?

Ich programmiere noch nicht lange und würde mich über Eure Hilfe sehr freuen!

GC.COLLECT entfernt Objekte sofort aus dem Speicher.
Allerdings ist dies wenig ratsam, da es Zeit kostet und das Framework die Speicherverwaltung selbst handhabt.

Wenn das Objekt später erneut angelegt wird, wird ein neues Objekt erzeugt und natürlich nicht aufgelöst.

Etwas anders ist es unter Windows Mobile, dort werden Objekte „wiederverwendet“.

Aber wie gesagt, im Normalfall KEIN GC.Collect verwenden, es sei denn du löst sehr sehr viele Grafikobjekte auf und benötigst den verfügbaren Speicher sofort.

Leider ist die Applikation so aufwendig, dass ich GC.Collect verwenden muss.

Die Dispose Exception die ich erhalte, wird dann wohl eine andere Ursache haben und nicht bedeuten, dass der GC mir einfach ein neuerstelltes Objekt löscht, dass ich vorher unter dem gleichen Namen mit Dispose und = null aufgelöst habe.

Vielen Dank für die Hilfe!

Schick mal das Stück Code, welches einen Fehler auslöst, ich schau mal drauf.

Also wie gesagt, es gibt KEINEN Grund den GC manuell anzustossen. Was möchtest du damit bewirken ?

Eigentlich verwendet man es nur, wenn objekte unverwaltete Resourcen ansprechen, wo der GC nicht sicher ermitteln kann, dass ein Objekt nicht mehr benötigt wird.
Zum Beispiel Grafik über die Win-API.

Hallo,

meines Wissens nach prüft der Garbage Collector selber in regelmäßigen Abständen den Speicher, ob nicht benutzte Objekte vorliegen und gibt den Speicher frei.

Das bedeutet, dass wenn du ein Objekt mit new anlegst und dieses Objekt benutzt wird, bzw. das Programm noch läuft, dann macht der GC nichts damit. Wenn du natürlich eigentständig, wie in deinem Codebeispiel, Objekte an den GarbageCollector gibst, kannst du im schlimmsten Fall damit Null-Referenz-Exceptions auslösen.

Ich hoffe, ich habe dir weiter helfen können.

Viele Grüße!

Vielen Dank für Eure Hilfe, ich habe feststellen können, dass der GC meine Objekte auch ohne GC.Collect aufräumt, wenn ich die Objekte mit .Dispose() und = null freigebe.

Leider lässt er sich manchmal extrem viel Zeit. So wie ich das verstehe räumt der GC selbst auf, wenn er merkt das der Speicher knapp wird. Allerding räumt er i.d.R. dann nicht alles auf einmal auf, sondern nur in Teilen von ca. 3 MB.

Woher weiß der GC denn, dass das was er aufgeräumt hat, für die nächste Erstellung meines Formulars ausreichend ist. Unter Umständen reicht der aufgeräumte Speicher doch gar nicht aus!?

Sorry, das kann ich dir leider auch nicht 100%ig genau sagen. Bisher hat bei mir aber immer alles reibungslos geklappt :wink: er macht seinen Job also ganz gut.

Viele Grüße!

Hallo userxxx,

sobald Du keine Referenz mehr auf ein Objekt hast, kann dessen Speicher vom GC freigegeben werden. Du hast allerdings keinen Einfluss darauf, wann genau das passiert, weil der GC seiner eigenen Logik folgt. Das tolle an .NET (und anderen Umgebungen mit Garbage Collector) ist, dass Du Dich in 99.9% aller Fälle nicht darum kümmern musst.

Wenn Du glaubst, die SELBE INSTANZ Deines Objekts irgendwann später nochmal zu brauchen, behalte einfach die Referenz darauf.

Wenn Du mit dem new Operator eine neue Instanz erstellst, dann wird immer neuer Speicher reserviert und ein neues Objekt erstellt. Das hat mit dem alten dann nichts mehr zu tun.

Ich hoffe, das hilft Dir einigermaßen weiter. Falls nicht, einfach nochmal nachfragen.

Viele Grüße,
Alex

wann der Garbage Collector aufräumt, kann wohl niemand so genau sagen. Ob er aber auch erst (oder noch) aufräumt, wenn das Objekt in der Zwischenzeit neu instanziert wurde, weiss ich zwar nicht mit 100-prozentiger Sicherheit, kann es mir aber ehrlich gesagt nicht vorstellen.
Normalerweise ist es auf jedenfall nicht nötig, die Objekte selber wieder freizugeben. Dies sollte man dem automatischen Garbage Collector überlassen, um eine bestmögliche Performance zu erreichen.

sorry, kann da nicht helfen.

gruß