Sobes.tech
Middle+

Opowiedz o zbieraczu śmieci (garbage collector) w języku Go.

sobes.tech AI

Odpowiedź od AI

Go używa równoległego, trójkolorowego, niekompaktującego zbieracza śmieci z niskimi opóźnieniami.

Podstawowe zasady działania:

  • Oznaczanie (Mark): Określa, które obiekty są osiągalne z wskaźników korzeniowych (rejestry, stosy gorutyn, zmienne globalne). Używa algorytmu trójkolorowego (biały - nieodwiedzony, szary - odwiedzony, ale potomkowie jeszcze nie sprawdzeni, czarny - odwiedzony i wszyscy potomkowie sprawdzeni).
  • Zamiatanie (Sweep): Usuwa nieosiągalne obiekty (pozostają białe) i zwalnia pamięć do ponownego użycia.

Cechy:

  • Równoległy: Oznaczanie odbywa się równolegle z wykonywaniem kodu użytkownika (fazy STW - Stop-The-World - są bardzo krótkie).
  • Niskie opóźnienia: Zaprojektowany, aby minimalizować przerwy w pracy aplikacji.
  • Niekompaktujący: Nie przesuwa żywych obiektów w pamięci, co może prowadzić do fragmentacji, ale upraszcza implementację i przyspiesza oznaczanie/zbieranie.

Fazy pracy:

  1. Pomoc w oznaczaniu: Goroutines użytkownika pomagają zbieraczowi w fazie oznaczania podczas alokacji pamięci.
  2. Oznaczanie: Równoległe oznaczanie osiągalnych obiektów.
  3. Zakończenie oznaczania: Krótka faza STW do finalizacji oznaczania.
  4. Zamiatanie: Równoległe usuwanie nieosiągalnych obiektów.

Zarządzanie:

  • Automatyczne.
  • Próg wyzwalania GC (garbage collection) regulowany jest przez zmienną środowiskową GOGC. Domyślnie GOGC=100, co oznacza, że zbieranie rozpocznie się, gdy rozmiar sterty podwoi się w stosunku do poprzedniego cyklu zbierania.
  • Funkcja runtime.GC() wymusza uruchomienie zbierania, ale jej użycie nie jest zalecane w standardowym kodzie.
package main

import (
	"runtime"
	"time"
)

func main() {
	// Przykład wymuszonego wywołania GC (rzadko konieczne)
	runtime.GC()

	// Przykład odczytu statystyk GC
	var memStats runtime.MemStats
	runtime.ReadMemStats(&memStats)
	// fmt.Printf("Całkowita przydzielona pamięć: %v bajtów\n", memStats.TotalAlloc)
}

Zalety:

  • Automatyczne zarządzanie pamięcią, zmniejsza prawdopodobieństwo błędów (wycieki pamięci, podwójne zwolnienia).
  • Zaprojektowany do wykonywania równoległego.

Wady:

  • Nieokreślony czas działania GC.
  • Możliwe zwiększenie zużycia pamięci w porównaniu do ręcznego zarządzania.