Go-Sprache hat GC. GC bezieht sich auf Garbage Collection, einen automatischen Speicherverwaltungsmechanismus; die Go-Sprache unterstützt GC, und die Wiederverwertung des Objektspeicherplatzes in der Go-Sprache wird durch den GC-Mechanismus abgeschlossen. Für die Go-Sprache verwendet der GC der Go-Sprache drei Farben: keine Generierung (Objekte werden nicht in Generationen unterteilt), keine Sortierung (Objekte werden während des Recyclingprozesses nicht verschoben und sortiert) und gleichzeitig (gleichzeitig mit Benutzercode ausgeführt) . Mark-and-Sweep-Algorithmus.
Die Betriebsumgebung dieses Tutorials: Windows 7-System, GO Version 1.18, Dell G3-Computer.
Der GC-Mechanismus wurde populär, nachdem die Java-Sprache weit verbreitet war. Die spätere Skriptsprache Python unterstützt GC und GO unterstützt auch GC.
Ein bemerkenswertes Merkmal der Go-Sprache und der C/C++-Sprache ist, dass die Wiederverwertung des Objektspeicherplatzes in Go durch den GC-Mechanismus erfolgt, der nicht manuell von Programmierern wie C++ beantragt und freigegeben werden muss, also relativ ist einfach in Go. Es kann leicht zu Speicherlecks kommen. Heute werden wir über den GC-Mechanismus in Go sprechen.
Was ist GC und wofür wird es verwendet?
GC, vollständiger Name Garbage Collection, ist ein Mechanismus zur automatischen Speicherverwaltung.
Wenn der vom Programm vom Betriebssystem angeforderte Speicher nicht mehr benötigt wird, recycelt die Garbage Collection ihn aktiv und verwendet ihn für andere Codes zur Beantragung von Speicher oder gibt ihn an das Betriebssystem zurück. Dies ist ein automatischer Recyclingprozess für Speicher -Level-Ressourcen, also Garbage Collection. Die für die Garbage Collection zuständige Programmkomponente ist der Garbage Collector.
Die Müllabfuhr ist tatsächlich ein perfektes Beispiel für „Einfachheit ist kompliziert“. Einerseits profitieren Programmierer von GC und müssen sich nicht um die manuelle Beantragung und Freigabe von Speicher kümmern. GC gibt den verbleibenden Speicher automatisch frei, wenn das Programm ausgeführt wird. Andererseits ist GC für Programmierer nahezu unsichtbar. Es erscheint nur dann, wenn das Programm eine spezielle Optimierung benötigt, indem es eine steuerbare API zur Steuerung des Ausführungszeitpunkts und des Ausführungsaufwands des GC bereitstellt.
Normalerweise ist der Ausführungsprozess des Garbage Collectors in zwei halbunabhängige Komponenten unterteilt:
Mutator: Dieser Name bezieht sich im Wesentlichen auf Code im Benutzermodus. Denn für den Garbage Collector ändert der Benutzermoduscode nur die Referenzbeziehung zwischen Objekten, d. h. er arbeitet am Objektdiagramm (einem gerichteten Diagramm der Referenzbeziehungen zwischen Objekten).
Collector: Der Code, der für die Durchführung der Garbage Collection verantwortlich ist.
Das Stammobjekt in GC
Das Stammobjekt wird in der Terminologie der Garbage Collection auch als Stammsammlung bezeichnet. Es ist das erste Objekt, das der Garbage Collector beim Markieren des Prozesses überprüft, einschließlich:
Globale Variablen: Variablen, die während des gesamten Lebenszyklus des Programms vorhanden sind und zur Kompilierungszeit bestimmt werden können.
Ausführungsstapel: Jede Goroutine enthält ihren eigenen Ausführungsstapel, der Variablen auf dem Stapel und Zeiger auf zugewiesene Heap-Speicherblöcke enthält.
Register: Der Wert des Registers kann einen Zeiger darstellen, und diese an der Berechnung beteiligten Zeiger können auf den von einem Evaluator zugewiesenen Heap-Speicherblock verweisen.
Wie GC implementiert wird
Die Existenz aller GC-Algorithmen kann auf die gemischte Verwendung zweier Formen zurückgeführt werden: Tracking (Tracing) und Referenzzählung (Reference Counting).
Tracking GC
beginnt beim Stammobjekt und fährt Schritt für Schritt auf der Grundlage der Referenzinformationen zwischen Objekten fort, bis der gesamte Heap gescannt und die aufzubewahrenden Objekte ermittelt werden, wodurch alle wiederverwertbaren Objekte recycelt werden. Go, Java und die JavaScript-Implementierung von V8 verfolgen alle GC.
Referenzzählung GC
Jedes Objekt selbst enthält einen Referenzzähler, der automatisch recycelt wird, wenn der Zähler Null erreicht. Da diese Methode viele Mängel aufweist, wird sie normalerweise nicht verwendet, wenn eine hohe Leistung angestrebt wird. Python, Objective-C usw. sind alle referenzzählende GCs.
Derzeit gehören zu den gängigsten GC-Implementierungsmethoden:
Tracking-Typ, der in viele verschiedene Typen unterteilt ist, wie zum Beispiel:
Mark Sweep: Ausgehend vom Stammobjekt werden die Objekte bestimmt um am Leben zu sein, sind gekennzeichnet, und Gegenstände aufräumen, die recycelt werden können.
Markierungsorganisation: Wird vorgeschlagen, um das Problem der Speicherfragmentierung zu lösen. Während des Markierungsprozesses werden Objekte so weit wie möglich in einem kontinuierlichen Speicherbereich organisiert.
Inkrementell: Führen Sie den Markierungs- und Reinigungsprozess stapelweise aus, wobei jedes Mal ein kleiner Teil ausgeführt wird, wodurch die Speicherbereinigung schrittweise vorangetrieben wird und nahezu Echtzeit und fast keine Pausen erreicht werden.
Inkrementelle Sortierung: Inkrementelle Sortierung von Objekten wird hinzugefügt.
Generation: Klassifizieren Sie Objekte nach der Länge ihrer Überlebenszeit. Diejenigen, deren Überlebenszeit unter einem bestimmten Wert liegt, sind die junge Generation, diejenigen, deren Überlebenszeit über einem bestimmten Wert liegt, sind die alte Generation und Objekte, die dies tun Niemals am Recycling teilnehmen, sind die permanente Generation. Und Objekte werden auf der Grundlage generationsübergreifender Annahmen recycelt (wenn ein Objekt nicht lange lebt, wird es tendenziell recycelt, wenn ein Objekt schon lange lebt, lebt es tendenziell länger).
Referenzzählung: Recyceln Sie entsprechend dem Referenzzähler des Objekts und recyceln Sie ihn sofort, wenn der Referenzzähler Null erreicht.
Die Implementierung von GC in Go
Für Go verwendet Gos GC keine Generation (Objekte werden nicht in Generationen unterteilt), keine Sortierung (Objekte werden während des Recyclingprozesses nicht bewegt und gesammelt), Reinigung), gleichzeitiger (gleichzeitig mit Benutzercode ausgeführter) dreifarbiger Markierungs-Sweep-Algorithmus. [Verwandte Empfehlungen: Go-Video-Tutorial]
Die Gründe sind wie folgt:
Der Vorteil der Objektdefragmentierung besteht darin, das Problem der Speicherfragmentierung zu lösen und die Verwendung einer sequentiellen Speicherzuweisung zu „ermöglichen“. Der Go-Laufzeitzuordnungsalgorithmus basiert jedoch auf tcmalloc und es gibt grundsätzlich kein Fragmentierungsproblem. Und der sequentielle Speicherzuweiser ist in Multithread-Szenarien nicht geeignet. Go verwendet einen modernen Speicherzuweisungsalgorithmus auf Basis von tcmalloc, und das Sortieren von Objekten bringt keine wesentlichen Leistungsverbesserungen.
Generational GC basiert auf der Generationenannahme, das heißt, GC legt das Hauptwiederherstellungsziel auf neu erstellte Objekte (die eine kurze Überlebenszeit haben und eher recycelt werden können), anstatt alle Objekte häufig zu überprüfen. Der Compiler von Go speichert jedoch die meisten neuen Objekte durch Escape-Analyse auf dem Stapel (der Stapel wird direkt recycelt), und nur die Objekte, die für längere Zeit vorhanden sein müssen, werden dem Heap zugewiesen, der eine Speicherbereinigung erfordert. Mit anderen Worten, die vom Generations-GC recycelten kurzlebigen Objekte werden direkt dem Stapel in Go zugewiesen. Wenn die Goroutine stirbt, wird der Stapel ohne Beteiligung des GC direkt recycelt zum direkten Vorteil. Darüber hinaus wird der Garbage Collector von Go gleichzeitig mit dem Benutzercode ausgeführt, sodass die STW-Zeit nichts mit der Generierung des Objekts und der Größe des Objekts zu tun hat. Das Go-Team konzentriert sich mehr darauf, wie GC besser gleichzeitig mit Benutzercode ausgeführt werden kann (unter Verwendung geeigneter CPUs zur Durchführung der Speicherbereinigung), als auf das einzige Ziel, die Pausenzeiten zu reduzieren.
Weitere Programmierkenntnisse finden Sie unter: Programmiervideo! !
Das obige ist der detaillierte Inhalt vonHat die Go-Sprache GC?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!