.NET Core - Speicherbereinigung
In diesem Kapitel werden wir das Konzept der Garbage Collection behandeln, eine der wichtigsten Funktionen der .NET Managed Code-Plattform. Der Garbage Collector (GC) verwaltet die Zuweisung und Freigabe von Speicher. Der Garbage Collector dient als automatischer Speichermanager.
Sie müssen nicht wissen, wie Sie Speicher zuweisen und freigeben oder die Lebensdauer der Objekte verwalten, die diesen Speicher verwenden
Eine Zuordnung erfolgt jedes Mal, wenn Sie ein Objekt mit einem "neuen" Schlüsselwort deklarieren oder ein Werttyp eingerahmt wird. Die Zuweisungen sind normalerweise sehr schnell
Wenn nicht genügend Speicher zum Zuweisen eines Objekts vorhanden ist, muss der GC Speicherbereinigungen sammeln und entsorgen, um Speicher für neue Zuweisungen verfügbar zu machen.
Dieser Vorgang ist bekannt als garbage collection.
Vorteile der Müllabfuhr
Garbage Collection bietet die folgenden Vorteile:
Sie müssen während der Entwicklung Ihrer Anwendung nicht manuell Speicher freigeben.
Außerdem werden Objekte auf dem verwalteten Heap effizient zugewiesen.
Wenn Objekte nicht mehr verwendet werden, werden diese Objekte durch Löschen ihres Speichers zurückgefordert und der Speicher für zukünftige Zuordnungen verfügbar gehalten.
Verwaltete Objekte erhalten zunächst automatisch sauberen Inhalt, sodass ihre Konstruktoren nicht jedes Datenfeld initialisieren müssen.
Es bietet auch Speichersicherheit, indem sichergestellt wird, dass ein Objekt den Inhalt eines anderen Objekts nicht verwenden kann.
Bedingungen für die Müllabfuhr
Die Speicherbereinigung erfolgt, wenn eine der folgenden Bedingungen erfüllt ist.
Das System hat wenig physischen Speicher.
Der Speicher, der von zugewiesenen Objekten auf dem verwalteten Heap verwendet wird, überschreitet einen akzeptablen Schwellenwert. Dieser Schwellenwert wird während des Prozesses kontinuierlich angepasst.
Das GC.CollectMethode wird aufgerufen und in fast allen Fällen müssen Sie diese Methode nicht aufrufen, da der Garbage Collector kontinuierlich ausgeführt wird. Diese Methode wird hauptsächlich für spezielle Situationen und Tests verwendet.
Generationen
Der .NET Garbage Collector verfügt über 3 Generationen und jede Generation verfügt über einen eigenen Heap, der zum Speichern der zugewiesenen Objekte verwendet wird. Es gibt ein Grundprinzip, dass die meisten Objekte entweder kurzlebig oder langlebig sind.
Generation First (0)
In Generation 0 werden zuerst Objekte zugewiesen.
In dieser Generation leben Objekte häufig nicht nach der ersten Generation, da sie zum Zeitpunkt der nächsten Speicherbereinigung nicht mehr verwendet werden (außerhalb des Gültigkeitsbereichs).
Generation 0 lässt sich schnell erfassen, da der zugehörige Heap klein ist.
Zweite Generation (1)
In Generation 1 haben Objekte einen Raum mit zweiter Chance.
Objekte, die nur von kurzer Dauer sind, aber die Sammlung der Generation 0 überleben (häufig basierend auf zufälligem Timing), gehen zur Generation 1.
Sammlungen der 1. Generation sind ebenfalls schnell, da der zugehörige Heap ebenfalls klein ist.
Die ersten beiden Heaps bleiben klein, da Objekte entweder gesammelt oder zum Heap der nächsten Generation befördert werden.
Dritte Generation (2)
In Generation 2 werden alle langen Objekte gelebt und sein Haufen kann sehr groß werden.
Die Objekte in dieser Generation können lange überleben, und es gibt keinen Heap der nächsten Generation, um Objekte weiter zu fördern.
Der Garbage Collector verfügt über einen zusätzlichen Heap für große Objekte, der als Large Object Heap (LOH) bezeichnet wird.
Es ist für Objekte reserviert, die 85.000 Byte oder mehr umfassen.
Große Objekte werden nicht den Generationshaufen zugeordnet, sondern direkt dem LOH
Sammlungen der Generation 2 und LOH können für Programme, die lange ausgeführt wurden oder große Datenmengen verarbeiten, spürbare Zeit in Anspruch nehmen.
Es ist bekannt, dass große Serverprogramme Haufen von 10 GB haben.
Der GC verwendet eine Vielzahl von Techniken, um die Zeit zu reduzieren, die er die Programmausführung blockiert.
Der primäre Ansatz besteht darin, so viel Garbage Collection-Arbeit wie möglich an einem Hintergrund-Thread so auszuführen, dass die Programmausführung nicht beeinträchtigt wird.
Der GC bietet Entwicklern auch einige Möglichkeiten, sein Verhalten zu beeinflussen, was zur Verbesserung der Leistung sehr nützlich sein kann.