Bei meiner Arbeit diskutieren wir verschiedene Ansätze, um eine große Menge an verwaltetem Speicher (50-100 MB) zu bereinigen, wobei zwei Ansätze auf dem Tisch liegen (sprich: zwei erfahrene Entwickler können sich nicht einigen) und der Rest des Teams ist sich nicht sicher, welcher Ansatz wünschenswerter ist: Leistung oder Wartbarkeit.
Die gesammelten Daten bestehen aus vielen kleinen Objekten, ca. 30000, die wiederum andere Objekte enthalten; alle Objekte werden verwaltet. Es gibt viele Verweise zwischen diesen Objekten, einschließlich Ereignis-Handlern, aber nicht auf externe Objekte. Wir bezeichnen diese große Gruppe von Objekten und Verweisen als eine einzige Einheit, die als Blob bezeichnet wird.
Ansatz #1: Stellen Sie sicher, dass alle Verweise auf Objekte im Blob getrennt sind, und lassen Sie die GC den Blob und alle Verbindungen verarbeiten.
Ansatz #2: Implementieren Sie IDisposable für diese Objekte, rufen Sie dispose für diese Objekte auf und setzen Sie Verweise auf Nothing und remove-Handler.
Die Theorie hinter dem zweiten Ansatz ist, dass die großen, langlebigen Objekte länger brauchen, um im GC bereinigt zu werden. Wenn man also die großen Objekte in kleinere Häppchen zerlegt, kann der Garbage Collector sie schneller verarbeiten, was einen Leistungsgewinn bedeutet.
Ich denke, die grundlegende Frage ist die folgende: Ist es besser, große Gruppen miteinander verbundener Objekte zu zerlegen, um die Daten für die Garbage Collection zu optimieren, oder ist es besser, sie zusammenzuhalten und sich darauf zu verlassen, dass die Garbage Collection-Algorithmen die Daten für Sie verarbeiten?
Ich habe das Gefühl, dass dies ein Fall von Voroptimierung ist, aber ich kenne den GC nicht gut genug, um zu wissen, was ihm hilft oder ihn behindert.
Editar: Der "Blob" des Speichers ist nicht ein einziges großes Objekt, sondern viele kleine Objekte, die einzeln zugewiesen werden.
Ein wenig mehr Hintergrund, falls es hilfreich ist. Wir hatten "Lecks", da die Objekte nicht GCed wurden. Beide Ansätze lösen das Leck-Problem, aber an diesem Punkt ist es eine Debatte darüber, welcher besser geeignet ist.