Als Teil des erweiterten Inhalts von .NET muss der Garbage Collector (kurz GC) verstanden werden. Gemäß dem Prinzip „leicht verständlich“ wird in diesem Artikel das Funktionsprinzip des Garbage Collectors in der CLR erläutert.
Grundkenntnisse
Managed Heap
Sehen wir uns zunächst die Erklärung von MSDN an: Bei der Initialisierung eines neuen Prozesses reserviert die Laufzeit einen kontinuierlichen Adressraumbereich für den Prozess. Dieser reservierte Adressraum wird als verwalteter Heap bezeichnet.
„Der verwaltete Heap ist auch ein Heap“, warum sagen Sie das? Ich sage das, weil ich hoffe, dass nicht jeder durch die „Terminologie“ verwirrt wird. Die Prämisse dieses Wissenspunkts ist „der Unterschied zwischen Werttypen und Referenztypen“. Es wird hier davon ausgegangen, dass der Leser bereits das wichtige Konzept kennt: „Werttypen werden auf dem Stapel gespeichert und Referenztypen werden auf dem Heap gespeichert. (Referenzen von Referenztypen werden auf dem Stapel gespeichert)“. Nach dieser Theorie erfordert die CLR also, dass alle Ressourcen mit Ausnahme der Werttypen vom verwalteten Heap zugewiesen werden.
Der verwaltete Heap verwaltet einen Zeiger, hier NextObjPtr genannt, der auf den Zuordnungsort des nächsten Objekts im Heap zeigt.
CPU-Register
Dies sind grundlegende Computerkenntnisse, um die folgenden „Grundkonzepte“ zu verstehen.
CPU-Register sind der eigene „temporäre Speicher“ der CPU, der schneller ist als der Speicherzugriff. In der Reihenfolge der Entfernung von der CPU sind die Register die nächstgelegenen, dann der Cache (Computer-Cache der ersten, zweiten und dritten Ebene) und schließlich der Speicher.
Wurzeln
Alle in der Klasse definierten statischen Felder, Methodenparameter, lokalen Variablen (nur Referenztypvariablen) usw. sind Wurzeln, ebenso wie die Objektzeiger im CPU-Registerstamm. Roots sind die verschiedenen Einstiegspunkte, die die CLR außerhalb des Heaps finden kann.
Objekte erreichbar und nicht erreichbar
Wenn sich ein Stamm auf ein Objekt im Heap bezieht, ist das Objekt „erreichbar“ „erreichbar“, andernfalls ist es „ unerreichbar“.
Der Grund für die Speicherbereinigung
Aus Sicht der Computerkomposition müssen sich alle Programme im Speicher befinden und ausgeführt werden. Und der Speicher ist ein limitierender Faktor (Größe). Darüber hinaus gelten für den verwalteten Heap auch Größenbeschränkungen. Wenn es keine Größenbeschränkung für den verwalteten Heap gibt, ist die Ausführungsgeschwindigkeit von C# besser als die von c (die Struktur des verwalteten Heaps ermöglicht eine schnellere Zuweisung von Objekten als der C-Laufzeit-Heap). Aufgrund von Adressraum- und Speicherbeschränkungen muss der verwaltete Heap seinen normalen Betrieb über einen Garbage-Collection-Mechanismus aufrechterhalten, um sicherzustellen, dass Objekte ohne „Speicherüberlauf“ zugewiesen werden.
Grundprinzipien der Garbage Collection
Recycling ist in zwei Phasen unterteilt: Markieren –> Komprimieren Der Prozess der
Markierung ist eigentlich der Prozess der Bestimmung, ob ein Objekt erreichbar ist. Wenn alle Wurzeln überprüft wurden, enthält der Heap erreichbare (markierte) und nicht erreichbare (nicht markierte) Objekte.
Nachdem die Markierung abgeschlossen ist, treten Sie in die Komprimierungsstufe ein. Während dieser Phase durchläuft der Garbage Collector linear den Heap, um zusammenhängende Speicherblöcke für nicht erreichbare Objekte zu finden. Und verschieben Sie erreichbare Objekte hierher, um den Heap zu komprimieren. Dieser Vorgang ähnelt in gewisser Weise der Defragmentierung von Speicherplatz.
Wie im Bild oben gezeigt, weist das grüne Kästchen auf erreichbare Objekte hin und das gelbe Kästchen auf nicht erreichbare Objekte. Nachdem nicht erreichbare Objekte gelöscht wurden, wird durch das Verschieben erreichbarer Objekte eine Speicherkomprimierung erreicht (die kompakter wird).
Nach der Komprimierung sind die „Zeiger auf diese Objekte“ der Variablen und CPU-Register nun ungültig, und der Garbage Collector muss alle Wurzeln erneut aufrufen und sie so ändern, dass sie auf die neuen Speicherorte der Objekte verweisen. Dies kann zu erheblichen Leistungseinbußen führen. Dieser Verlust ist auch der Hauptnachteil des verwalteten Heaps.
Aufgrund der oben genannten Merkmale ist auch der durch die Müllabfuhr verursachte Recyclingalgorithmus ein Forschungsthema. Denn wenn Sie wirklich warten, bis der verwaltete Heap voll ist, bevor Sie mit der Garbage Collection beginnen, wird es wirklich „langsam“.
Garbage-Collection-Algorithmus – Generierungsalgorithmus
Die Generierung ist ein Mechanismus, der vom CLR-Garbage Collector verwendet wird. Sein einziger Zweck besteht darin, die Leistung der Anwendung zu verbessern. Das generationsübergreifende Recycling ist offensichtlich schneller als das Recycling des gesamten Haufens.
Der CLR-verwaltete Heap unterstützt drei Generationen: Generation 0, Generation 1 und Generation 2. Der Speicherplatz der Generation 0 beträgt etwa 256 KB, der der Generation 1 etwa 2 MB und der der Generation 2 etwa 10 MB. Das neu erstellte Objekt wird der Generation 0 zugeordnet.
Wie in der Abbildung oben gezeigt, beginnt der Garbage Collector mit dem Recycling und dem Objekt, wenn der Raum der Generation 0 voll ist nicht erreichbar sind (C und E im Bild oben), werden recycelt und die überlebenden Objekte werden als Objekte der ersten Generation klassifiziert.
Wenn der Raum der 0. Generation voll ist und die 1. Generation auch viele unerreichbare Objekte enthält, so dass der Raum fast voll ist, wird der Müll beider Generationen recycelt. Für überlebende Objekte (erreichbare Objekte) wird Generation 0 auf Generation 1 und Generation 1 auf Generation 2 hochgestuft.
Der eigentliche Sammelmechanismus der CLR-Generation ist „intelligenter“. Wenn das neu erstellte Objekt einen kurzen Lebenszyklus hat, wird der Müll der 0. Generation sofort vom Garbage Collector recycelt (ohne darauf zu warten, dass der Speicherplatz voll ist). zugewiesen). Wenn außerdem Generation 0 recycelt wird und festgestellt wird, dass noch viele Objekte „erreichbar“ sind und
nicht viel Speicher freigegeben hat, wird das Budget der Generation 0 auf 512 KB erhöht, und der Recyclingeffekt wird erhöht umgewandelt werden in: Die Anzahl der Speicherbereinigungen wird reduziert, aber jedes Mal wird eine große Menge Speicher zurückgefordert. Wenn nicht viel Speicher freigegeben wurde, führt der Garbage Collector eine vollständige Wiederverwendung (3 Generationen) durch. Wenn immer noch nicht genügend Speicher vorhanden ist, wird eine „Speicherüberlauf“-Ausnahme ausgelöst.
Mit anderen Worten: Der Garbage Collector passt das zugewiesene Speicherplatzbudget jeder Generation basierend auf der Größe des wiederhergestellten Speichers dynamisch an! Erzielen Sie eine automatische Optimierung!
Zusammenfassung
Hinter der Garbage Collection steckt eine Grundidee: Programmiersprachen (die meisten davon) scheinen immer Zugriff auf unbegrenzten Speicher zu haben. Und Entwickler können immer weiter zuweisen, zuweisen und immer wieder zuweisen – wie von Zauberhand, unerschöpflich.
Das grundlegende Arbeitsprinzip des .NET-Garbage Collectors besteht darin, nicht erreichbare Objekte durch das grundlegendste Markierungs- und Löschprinzip zu löschen und dann den verfügbaren Speicher wie bei der Festplattendefragmentierung zu komprimieren und schließlich die höchste Leistung durch Optimierung des Generationsalgorithmus zu erzielen .