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:
- Pomoc w oznaczaniu: Goroutines użytkownika pomagają zbieraczowi w fazie oznaczania podczas alokacji pamięci.
- Oznaczanie: Równoległe oznaczanie osiągalnych obiektów.
- Zakończenie oznaczania: Krótka faza STW do finalizacji oznaczania.
- 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ślnieGOGC=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.