Как работает garbage collector в golang
Как работает Garbage Collector (GC) в Go?
Garbage Collector (GC) в Go управляет памятью автоматически, очищая объекты, которые больше не используются. Он работает асинхронно и инкрементально, минимизируя задержки.
Основные принципы работы GC в Go
-
Трассировка (Tracing GC)
- Go использует «mark-and-sweep»:
- Mark (Пометка) – находит живые объекты, начиная с корневых (
stack
,heap
,global variables
). - Sweep (Сборка) – освобождает неиспользуемые объекты.
- Mark (Пометка) – находит живые объекты, начиная с корневых (
- Go использует «mark-and-sweep»:
-
Три поколения объектов
- «Young» – недавно созданные объекты.
- «Mature» – часто используемые.
- «Old» – долгоживущие объекты, проверяются реже.
-
Параллельная работа (Concurrent GC)
GC
работает в фоне, не останавливая всю программу.
-
Stop-the-world (STW) фаза
- Короткая пауза, когда Go приостанавливает выполнение всех горутин, чтобы отметить активные объекты.
- Оптимизирована, чтобы занимать <1мс в современных версиях Go.
Как GC освобождает память?
- Если объект не имеет ссылок – он собирается GC.
- Stack-allocated объекты очищаются автоматически.
- Heap-allocated объекты освобождаются GC.
- Если структура содержит слайс, мапу или канал – они тоже участвуют в GC.
Пример работы GC в Go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package main import ( "fmt" "runtime" ) func main() { // Выделяем память под объект data := make([]byte, 10*1024*1024) // 10MB fmt.Println("Выделена память:", len(data)) // Удаляем ссылку на объект data = nil // Запускаем GC вручную (обычно не нужно!) runtime.GC() fmt.Println("GC запущен, память освобождена") } |
Оптимизация работы GC
✔ Используйте sync.Pool
– для повторного использования объектов.
✔ Минимизируйте выделение памяти – избегайте ненужных аллокаций.
✔ Следите за утечками памяти – не храните ненужные ссылки.
✔ Профилируйте GC (pprof
) – чтобы находить узкие места.
Вывод
- GC в Go – это конкурентный, инкрементальный, stop-the-world garbage collector.
- Работает в фоне и с минимальными паузами.
- Автоматически очищает память, но требует оптимального использования ресурсов.
Recommended Posts
Golang map и Swiss Table
16.03.2025