Heim  >  Artikel  >  Backend-Entwicklung  >  Muss die Go-Sprache den Speicher manuell verwalten?

Muss die Go-Sprache den Speicher manuell verwalten?

青灯夜游
青灯夜游Original
2022-12-16 15:05:595176Durchsuche

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.

Muss die Go-Sprache den Speicher manuell verwalten?

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).
  • Collector: Der Code, der für die Durchführung der Garbage Collection verantwortlich ist.
  • Root-Objekt in GC

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.
  • 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 einigen Evaluatoren zugewiesenen Heap-Speicherblock verweisen.

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 Sammlung

Muss die Go-Sprache den Speicher manuell verwalten?

1.1 Implementierungsprinzip

Die Garbage Collection der Go-Sprache kann in vier verschiedene Phasen unterteilt werden: klare Beendigung, Markierung, markierte Beendigung und Löschen. Zwei der Phasen erzeugen Stop The World (STW)

Beendigungsphase löschen

Muss die Go-Sprache den Speicher manuell verwalten?

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

  • Mark Stage (STW)

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)

    • Pause das Programm, wechsle den Status auf _GCmarktermination und schließe das als Hilfsprogramm markierte Benutzerprogramm _GCmarktermination 并关闭辅助标记的用户程序
    • 清理处理器上的线程缓存

    清理阶段

    • 将状态切换至 _GCoff

      Bereinige den Thread-Cache auf dem Prozessor
    • Reinigungsphase
      • Schalten Sie den Status auf _GCoff um, um die Bereinigungsphase zu starten, initialisieren Sie den Bereinigungsstatus und deaktivieren Sie die Schreibbarriere.

    Stellen Sie den Benutzer wieder her Programm, alle neu erstellten Objekte werden weiß markiert

    Alle Speicherverwaltungseinheiten gleichzeitig im Hintergrund bereinigen Wenn Goroutine eine neue Speicherverwaltungseinheit beantragt, wird die Bereinigung ausgelöst

    • 1.2 Dreifarbig Markierungsmethode
    Dreifarbiger Markierungsalgorithmus markiert die Objekte im Programm. Unterteilt in drei Kategorien: Weiß, Schwarz und Grau:

      Weiße Objekte – potenzieller Müll, dessen Speicher vom Garbage Collector zurückgewonnen werden kann
    • Schwarze Objekte – Aktive Objekte, einschließlich Objekte, die keinen Verweis auf externe Zeiger und Objekte vom Stammobjekt haben. Erreichbare Objekte

    • Graue Objekte – Aktive Objekte, da es externe Zeiger auf weiße Objekte gibt, scannt der Garbage Collector die untergeordneten Objekte dieser Objekte
    • Das Funktionsprinzip des dreifarbig markierten Garbage Collectors ist einfach. Sie können die folgenden Schritte zusammenfassen:
    • Wählen Sie ein graues Objekt aus der Sammlung grauer Objekte aus und markieren Sie es schwarz.

    Muss die Go-Sprache den Speicher manuell verwalten? 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!

    Stellungnahme:
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
    Vorheriger Artikel:Was ist Go-Sprach-Coroutine?Nächster Artikel:Was ist Go-Sprach-Coroutine?