Garbage Collection

Vor allem in systemnahen Programmiersprachen (z.B. C) muss die Speicherverwaltung von Hand erledigt werden. Es muss also Speicher reserviert werden und falls er nicht mehr verwendet wird, sollte er wieder freigegeben werden. Wird der Speicher nicht wieder freigegeben, geht dem Programm der Speicherplatz aus. Bei der Entwicklung können sich so schnell Fehler einschleichen. Solche Fehler werden meist nicht während des kurzzeitigen Betriebs bei der Entwicklung entdeckt, sondern erst nachdem das Programm ein bis zwei Tage am Stück gearbeitet hat.

Deshalb wird in vielen Programmiersprachen (z.B. Java) eine automatische Speicherbereinigung (Garbage Collection) vorgenommen. Dabei sucht ein Programm im Hintergrund nach nicht mehr referenziertem Speicher und gibt diesen automatisch wieder frei. Diese Vermeidung von Fehler wird aber mit einem höheren Ressourcenverbrauch erkauft. Gerade bei systemnahen Sprachen ist ein Garbage Collector deshalb ein häufiger Kritikpunkt.

Auch Go, welches unter anderem durch seine Performance glänzt, verwendet einen Garbage Collector. In Go 1.5 wird ein concurrent, tri-color, mark-sweep collector verwendet. Die Idee zu diesem Algorithmus hatte Dijkstra 1978. Beim diesem Algorithmus können Objekte die Farben Weiss, Grau und Schwarz (tri-color) haben. Zu Beginn sind alle Objekte weiss. Der Garbage Collector holt sich jetzt die Root-Objekte z.B. aus dem Stack. Diese Objekte markiert (mark) er mit Grau. Danach wählt er ein Objekt zur weiteren Verfolgung aus und markiert dieses Schwarz. Jetzt folgt er den Referenzen des schwarzen Objekts und sobald er ein weisses findet, färbt er dieses Grau. Dieser Vorgang wird so lange wiederholt bis keine grauen Objekte mehr vorhanden sind. Danach können alle weissen Objekte entfernt (sweep) werden.

Durch den Mark-Sweep-Algorithmus können auch zyklische Referenzen entfernt werden, allerdings muss für das Markieren die Abarbeitung des Hauptprogrammes unterbrochen (stop-the-world) werden. Sonst könnte das Hauptprogramm weiterhin Objekte referenzieren, welche dann aber entfernt würden. Bei Go laufen aber das Hauptprogramm und der Garbage Collector auch während des Markierens parallel. Dies wird durch eine write-barrier ermöglicht. Allerdings kann es von Zeit zu Zeit zu einem stop-the-world kommen, allerdings dauert diese Unterbrechung höchstens 10ms.

Mit der Umgebungsvariable GOGC kann der Garbage Collector beeinflusst werden. Ist der Wert grösser als 100 wird weniger Zeit mit Garbage Collection verbracht aber auch mehr Speicher verwendet. Wählt man einen Wert kleiner als 100 wird mehr Garbage Collection durchgeführt und der Speicherverbrauch sinkt.