(Für Go 1.8 - Q1 2017 siehe unten )
Das nächste Go 1.5 gleichzeitig Garbage Collector von beinhaltet das "Tempo", sagte gc. In diesem Artikel
wird ein Vorschlag vorgestellt , der möglicherweise für Go 1.5 geeignet ist, aber auch zum Verständnis des GC in Go beiträgt.
Sie können den Zustand sehen vor 1.5 sehen (Stop The World: STW)
Vor Go 1.5 hat Go einen parallelen Stop-the-World- Kollektor (STW) verwendet.
Während die STW-Sammlung viele Nachteile hat, weist sie zumindest ein vorhersehbares und kontrollierbares Heap-Wachstumsverhalten auf.
(Foto aus der GopherCon 2015- Präsentation " Go GC: Lösen des Latenzproblems in Go 1.5 ")
Der einzige Abstimmknopf für den STW-Sammler war „GOGC“, das relative Haufenwachstum zwischen den Sammlungen. Die Standardeinstellung 100% löste jedes Mal eine Speicherbereinigung aus, wenn sich die Heap-Größe gegenüber der Live-Heap-Größe gegenüber der vorherigen Sammlung verdoppelte:
GC-Timing im STW-Kollektor.
Go 1.5 führt einen gleichzeitigen Kollektor ein .
Dies hat viele Vorteile gegenüber der STW-Sammlung, aber es m erschwert jedoch die Kontrolle des Heap-Wachstums, da die Anwendung Speicher zuweisen kann, während der Garbage Collector ausgeführt wird .
(Foto von der GopherCon 2015 Präsentation "Go GC: Lösen des Latenzproblems in Go 1.5 ")
Um das gleiche Heap-Wachstumslimit zu erreichen, muss die Laufzeit die Garbage Collection früher starten. Wie viel früher, hängt jedoch von vielen Variablen ab, von denen viele nicht vorhergesagt werden können.
- Starten Sie den Collector zu früh, und die Anwendung führt zu viele Speicherbereinigungen durch, wodurch CPU-Ressourcen verschwendet werden.
- Starten Sie den Kollektor zu spät, und die Anwendung überschreitet das gewünschte maximale Heap-Wachstum.
Um das richtige Gleichgewicht zu erreichen, ohne die Parallelität zu beeinträchtigen, muss der Garbage Collector sorgfältig auf und ab gehen.
Die GC-Stimulation zielt darauf ab, in zwei Dimensionen zu optimieren: Heap-Wachstum und vom Garbage Collector genutzte CPU.
Das Design der GC-Stimulation besteht aus vier Komponenten:
- ein Schätzer für den Umfang der Scanarbeit, die ein GC-Zyklus erfordert,
- einen Mechanismus für Mutatoren, um die geschätzte Menge an Scanarbeit bis zum Erreichen des Heap-Ziels durch die Heap-Zuweisung auszuführen;
- ein Scheduler für das Scannen im Hintergrund, wenn der Mutator das CPU-Budget nicht ausnutzt, und
- ein Proportionalregler für den GC-Trigger.
Das Design gleicht zwei verschiedene Zeitansichten aus: CPU-Zeit und Heap-Zeit .
- Die CPU-Zeit entspricht der Standard-Wanduhrzeit, vergeht jedoch
GOMAXPROCS
schneller.
Das heißt, wenn GOMAXPROCS
es 8 ist, vergehen acht CPU-Sekunden pro Wandsekunde und GC erhält jede Wandsekunde zwei Sekunden CPU-Zeit.
Der CPU-Scheduler verwaltet die CPU-Zeit.
- Der Durchlauf der Heap-Zeit wird in Bytes gemessen und bewegt sich vorwärts, wenn Mutatoren zuweisen.
Die Beziehung zwischen Heap-Zeit und Wandzeit hängt von der Zuordnungsrate ab und kann sich ständig ändern.
Mutator unterstützt die Verwaltung des Heap-Zeitverlaufs und stellt sicher, dass die geschätzte Scan-Arbeit abgeschlossen ist, wenn der Heap die Zielgröße erreicht.
Schließlich erstellt der Trigger-Controller eine Rückkopplungsschleife, die diese beiden Zeitansichten miteinander verbindet und sowohl für die Heap-Zeit- als auch für die CPU-Zeitziele optimiert.