Zuerst ein wenig darüber nachdenken, was ein großes Objekt ist. In .net wird ein großes Objekt als 85.000 oder mehr Bytes betrachtet. Haben Sie wirklich so große Objekte oder haben Sie ein sehr großes Diagramm von kleineren Objekten?
Wenn es sich um ein Diagramm kleiner Objekte handelt, werden diese im SOH (Small Object Heap) gespeichert. Wenn Sie in diesem Fall Objekte erstellen und sofort loslassen, profitieren Sie am besten von den Optimierungen des Garbage Collectors, die ein Generationenmodell voraussetzen. Was ich meine ist, dass du entweder Objekte erstellst und sie zum Sterben gehen lässt oder sie für immer hältst. Sich an sie zu halten, "nur für eine Weile", oder mit anderen Worten, Pooling, wird sie nur zu höheren Generationen (bis Gen 2) befördert haben und das wird die Leistung des GC zunichtemachen, weil das Aufräumen von Gen 2 Objekten teuer ist (ewige Objekte in Gen 2 sind jedoch nicht teuer). Mach dir keine Sorgen über Speicherfragmentierung. Es sei denn, Sie tun Interop oder ausgefallene Dinge wie das Festhalten von Objekten, der GC ist sehr effektiv bei der Vermeidung von Speicherfragmentierung - er komprimiert den Speicher, der aus dem kurzlebigen Segment freigesetzt wird.
Wenn Sie tatsächlich sehr große Objekte haben (zum Beispiel sehr große Arrays), dann kann es sich lohnen, sie zu poolen. Beachten Sie jedoch, dass, wenn die Arrays Verweise auf kleinere Objekte enthalten, deren Zusammenführung zu den Problemen führen wird, über die ich im vorherigen Absatz gesprochen habe. Daher sollten Sie das Array (mit seinen Referenzen auf null) häufig säubern (jede Iteration?).
auch sagen, dass die Tatsache, dass Sie anrufen IDisposable nicht Objekte reinigen. Der GC tut dies. Dispose ist für die Bereinigung nicht verwalteter Ressourcen zuständig. Dennoch ist es sehr wichtig, dass Sie entsorgen, deren Klasse auf jedes Objekt behalten Aufruf implementiert IDisposable (der beste Weg ist schließlich durch), weil Sie möglicherweise nicht verwalteten Ressourcen freisetzen, werden sofort und auch, weil Sie GC sagen es braucht nicht zu anrufen der Finalizer des Objekts, der zur unnötigen Förderung des Objekts führen würde, das, wie wir gesehen haben, ein Nein ist.
Fazit, der GC ist wirklich gut in der Zuteilung und Reinigung von Sachen. Wenn Sie versuchen, ihm zu helfen, führt das normalerweise zu schlechteren Ergebnissen, es sei denn, Sie wissen wirklich, was vor sich geht.
wirklich verstehen, was ich rede:
Garbage Collection: Automatic Memory Management in the Microsoft .NET Framework
Garbage Collection: Automatic Memory Management in the Microsoft .NET Framework 2
Large Object Heap Uncovered
Ist das eine Hausaufgabe? –
Ich wünschte, es wäre. Aber es ist nur ein Diskussionsthema, das wir nicht loswerden können ... Ich möchte hier keine möglichen Antworten geben, aber ich habe sicherlich eine Idee, von der ich hoffe, dass sie bestätigt oder widerlegt wird. Sollte auch helfen, den Überblick über den Kontext zu bekommen. – user492238
Afaik Pooling ist sehr wichtig für große verwaltete Objekte. – CodesInChaos