Middle
Mennyire ismeri a Go nyelv szemétgyűjtőjét?
sobes.tech MI
Válasz az MI-től
A Golang párhuzamos és alacsony késleltetésű szemétgyűjtőt használ, amely a mark-sweep algoritmuson alapul.
Fő jellemzők:
- Háromszínű algoritmus (Three-color algorithm): Három színnel jelöli az objektumokat: fehér (potenciális szemét), szürke (elérhető objektum, de leszármazottai nem ellenőrzöttek) és fekete (elérhető objektum és leszármazottai).
- Párhuzamosság (Parallel): Parallelen fut a felhasználói goroutine-kkal több magon, minimalizálva a leállási időt.
- Konkurencia (Concurrent): A GC nagy része egyidejűleg történik a program futásával.
- Alacsony késleltetésű Stop-The-World (Low-latency Stop-The-World): A goroutine-ok leállási ideje (STW) rendkívül rövid, csak a "jelölés kezdete" (start of marking) és a "jelölés vége" (end of marking) fázisokban használják, az objektumgrafikon konzisztenciájának biztosítására.
- Újrahasznosítható verem szkennelés (Stack scanning): A verem szkennelése szintén párhuzamosan és egyidejűleg történik az STW-vel.
- Heap növekedési cél (Heap growth target): A GC megpróbálja fenntartani a heap egy meghatározott százalékát minden ciklus után, elkerülve a túl gyakori vagy túl ritka ciklusokat. Ezt a küszöböt a
GOGCváltozóval lehet szabályozni. Alapértelmezett értékGOGC=100, ami azt jelenti, hogy a GC akkor indul, amikor a heap mérete megkétszereződik.
A GC ciklus a következő fázisokból áll:
- GCstart: Rövid STW fázis. A gyökérobjektumokat határozza meg a jelöléshez.
- GCmark: Egyidejű fázis. A GC végigjárja az objektumgrafot, és jelöli az elérhető objektumokat (szín szürke -> fekete). Írási barrier-t használ a graf változásainak követésére a jelölés során.
- GCmarktermination: Rövid STW fázis. Befejezi a jelölést és a sweep-re vált.
- GCsweep: Egyidejű fázis. Az elérhetetlen (fehér) objektumokat felszabadítja. Ez a fázis háttérben vagy szükség szerint történik az új memória allokálásakor.
A Go GC automatikusan kezeli, és a legtöbb esetben nem szükséges manuálisan hívni. A GC teljesítményét a GODEBUG=gctrace=1 környezeti változókkal lehet nyomon követni.
Monitorozási példa:
$ GODEBUG=gctrace=1 go run your_program.go
A gctrace kimenete információkat mutat minden GC ciklusról, beleértve a fázis időket, a heap méretét és a STW időt.
A GC optimalizálásához, a GOGC beállítása mellett, érdemes lehet:
- Csökkenteni az allokációk számát (pl. puffer újrahasználata, szükségtelen átalakítások elkerülése).
- Profilozni az "escape analysis" szempontjából, hogy megértse, mely objektumok kerülnek a heap-re.
- Gyakran létrehozott és felszabadított objektumokra a
sync.Poolhasználata.