Die Go-Sprache erfordert keine manuelle Speicherverwaltung; die Go-Sprache verfügt über eine integrierte Speicherverwaltungsfunktion (GC-Mechanismus), bei der es sich um einen automatischen Speicherverwaltungsmechanismus handelt. 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. Dieser automatische Recyclingprozess für Ressourcen auf Speicherebene erfolgt Es handelt sich um eine Garbage Collection, und die für die Garbage Collection zuständige Programmkomponente ist der Garbage Collector.
Die Betriebsumgebung dieses Tutorials: Windows 7-System, GO Version 1.18, Dell G3-Computer.
Die Go-Sprache erfordert keine manuelle Speicherverwaltung. Die Go-Sprache verfügt über eine integrierte Speicherverwaltungsfunktion (GC-Mechanismus), und Entwickler müssen sich nicht um die Anwendung und Freigabe von Speicher kümmern, was großen Komfort bietet an Benutzer.
Was ist GC und wozu dient es?
GC, vollständiger Name Garbage Collection, ist ein automatischer Speicherverwaltungsmechanismus. 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. Bei Berechnungen enthält der Speicherplatz zwei wichtige Bereiche: den Stapelbereich (Stack) und den Heap-Bereich (Heap); im Stapelbereich werden im Allgemeinen die Parameter, Rückgabewerte und lokalen Variablen von Funktionsaufrufen gespeichert und nicht erzeugt Die Speicherfragmentierung erfordert keine Entwicklerverwaltung. In der Go-Sprache werden Objekte im Heap-Bereich vom Garbage Collector zugewiesen Der Kollektor ist in zwei halbunabhängige Komponenten unterteilt: Mutator: Dieser Name bezieht sich im Wesentlichen auf Benutzermoduscode. 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).Das Root-Objekt wird in der Terminologie der Garbage Collection auch als Root-Sammlung bezeichnet. Es ist das erste Objekt, das der Garbage Collector beim Markieren des Prozesses überprüft, einschließlich:
Global Variablen: Variablen, die während des gesamten Lebenszyklus des Programms vorhanden sind, können zur Kompilierungszeit bestimmt werden.Garbage CollectionIn der Go-Sprache ist der vom Garbage Collector implementierte Algorithmus ein gleichzeitiger dreifarbiger Markierungs- und Scan-Collector.
Der Garbage Collector wird gleichzeitig mit dem Go-Programm ausgeführt Daher muss ein Algorithmus mit „Schreibbarriere“ durchlaufen werden, um mögliche Änderungen im Speicher zu erkennen. Die einzige Bedingung zum Initiieren einer Schreibbarriere besteht darin, das Programm für einen kurzen Zeitraum anzuhalten, d. h. „Stop the World“ Der Zweck der Schreibbarriere besteht darin, dem Collector zu ermöglichen, die Datenintegrität auf dem Heap aufrechtzuerhalten während der Sammlung1.1 Implementierungsprinzip
Pause das Programm, alle Prozessoren gelangen zu diesem Zeitpunkt in den sicheren Punkt Wenn der aktuelle Speicherbereinigungszyklus zwangsweise ausgelöst wird, müssen wir uns auch mit der Speicherverwaltungseinheit befassen, die dies nicht getan hat wurde bereinigt
Schalten Sie den Status auf um, aktivieren Sie Schreibbarrieren, Benutzerprogrammunterstützung (Mutator Assists) und stellen Sie das Root-Objekt in die Warteschlange
Setzen Sie das Ausführungsprogramm fort, der Markierungsprozess und das unterstützende Benutzerprogramm beginnen gleichzeitig mit der Markierung von Objekten im Speicher. Die Schreibbarriere markiert sowohl überschriebene Zeiger als auch neue Zeiger grau und alle neu erstellten Objekte werden direkt markiert black
Starten Sie das Scannen des Stammobjekts, einschließlich aller Goroutine-Stacks, globalen Objekte und Laufzeitdatenstrukturen, die sich nicht im Heap befinden. Während des Scannens des Goroutine-Stacks wird der aktuelle Prozessor angehalten
Verarbeiten Sie die Objekte im Die graue Warteschlange wiederum markiert Objekte schwarz und markiert die Objekte, auf die sie zeigen, grau.
Verwenden Sie einen verteilten Beendigungsalgorithmus, um die verbleibende Arbeit zu überprüfen, und treten Sie nach Abschluss der Markierungsphase in die Markierungsbeendigungsphase ein.
Markieren Beendigungsphase (STW)
_GCmarktermination
und schließe das als Hilfsprogramm markierte Benutzerprogramm _GCmarktermination
并关闭辅助标记的用户程序清理阶段
将状态切换至 _GCoff
_GCoff
um, um die Bereinigungsphase zu starten, initialisieren Sie den Bereinigungsstatus und deaktivieren Sie die Schreibbarriere.Schwarze Objekte – Aktive Objekte, einschließlich Objekte, die keinen Verweis auf externe Zeiger und Objekte vom Stammobjekt haben. Erreichbare Objekte
Markieren Sie alle Objekte Zeigt durch das schwarze Objekt als grau an und stellt sicher, dass das Objekt und das Objekt sind. Keines der referenzierten Objekte wird recycelt.
Wiederholen Sie die beiden oben genannten Schritte, bis im Objektdiagramm keine grauen Objekte mehr vorhanden sind Weitere Programmierkenntnisse finden Sie unter:
Programmiervideo🎜! ! 🎜Das obige ist der detaillierte Inhalt vonMuss die Go-Sprache den Speicher manuell verwalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!