Внутреннее устройство сборщика мусора
Трёхцветная пометка с очисткой, GOGC и паузы GC
«Внутреннее устройство сборщика мусора» — бесплатный урок Go Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Трёхцветная маркировка и очистка
Сборщик мусора Go использует параллельный алгоритм трёхцветной маркировки и очистки. Объекты бывают белыми (не посещены), серыми (найдены, но их дочерние объекты ещё не просканированы) или чёрными (полностью просканированы). Белые объекты считаются мусором на этапе очистки.
Параллельная сборка мусора
Сборщик мусора Go работает в основном параллельно с горутинами приложения. В большинстве программ это сокращает паузы полной остановки (STW) до менее чем одной миллисекунды.
Барьер записи
Барьер записи перехватывает записи указателей во время параллельной фазы маркировки, чтобы сохранять инвариант: чёрные объекты не должны указывать на белые объекты. Это добавляет небольшие накладные расходы при каждой записи указателя.
Фазы STW
Две короткие паузы STW в каждом цикле сборки мусора: (1) подготовка маркировки (включение барьера записи, создание снимка стеков горутин), (2) завершение маркировки (проверка, что все серые объекты просканированы). P99 обычно составляет <1ms.
GOGC
Порог запуска сборщика мусора задаётся параметром GOGC (по умолчанию 100). Это означает: «запускать сборщик мусора, когда размер занятой кучи увеличится вдвое по сравнению с предыдущей сборкой». Значение GOGC=50 запускает сборку мусора чаще и требует меньше памяти; GOGC=200 — реже, но требует больше памяти.
GOMEMLIMIT
GOMEMLIMIT (Go 1.19+) задаёт мягкий лимит памяти. Когда куча приближается к этому лимиту, сборщик мусора работает более интенсивно независимо от значения GOGC. Используйте его, чтобы предотвратить завершение процесса из-за OOM в средах с ограниченной памятью.
import "runtime/debug"
debug.SetMemoryLimit(512 * 1024 * 1024)Регулирование темпа
Сборщик мусора регулирует свою работу так, чтобы завершить маркировку до того, как куча заполнится относительно GOGC. При высокой скорости выделения памяти он увеличивает число горутин, помогающих выполнять маркировку.
runtime.GC()
Вызов runtime.GC() принудительно запускает немедленный цикл сборки мусора. Это полезно в тестах, чтобы гарантировать запуск финализаторов, или в тестах производительности, чтобы начинать с чистой кучи. Не вызывайте его в рабочем коде.
Финализаторы
Зарегистрируйте функцию, которая будет выполнена при сборке объекта мусором, с помощью runtime.SetFinalizer. Финализаторы запускаются в отдельной горутине после сборки мусора. Не используйте их для освобождения ресурсов — вместо этого применяйте методы Close().
Метрики сборщика мусора
Читайте статистику сборщика мусора из runtime.ReadMemStats или предоставляйте её через метрики Prometheus. Основные поля: NumGC, PauseNs, HeapAlloc, HeapInuse.
var m runtime.MemStats
runtime.ReadMemStats(&m)
fmt.Printf("GC cycles: %d, last pause: %dns\n", m.NumGC, m.PauseNs[(m.NumGC+255)%256])Фоновый очиститель
Фоновый очиститель возвращает неиспользуемую память кучи операционной системе. Он работает параллельно и регулирует свою скорость так, чтобы не влиять на производительность основного кода. Используется системный вызов MADV_FREE или MADV_DONTNEED.
Быстрая проверка
Что делает GOMEMLIMIT в Go 1.19 и более поздних версиях?
Повторение: внутреннее устройство сборщика мусора
Основные моменты:
- Параллельная трёхцветная маркировка и очистка; две короткие паузы STW
- GOGC управляет коэффициентом роста кучи; значение по умолчанию — 100 (рост на 100% запускает сборку мусора)
- GOMEMLIMIT обеспечивает безопасность контейнеров при ограниченной памяти (Go 1.19+)
- runtime.ReadMemStats предоставляет метрики сборщика мусора
Изучай Go с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 51
- Уроки
- 203
Часто задаваемые вопросы
Урок «Внутреннее устройство сборщика мусора» бесплатный?
Да — полный текст урока «Внутреннее устройство сборщика мусора» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Внутреннее устройство сборщика мусора»?
Трёхцветная пометка с очисткой, GOGC и паузы GC Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Внутреннее устройство сборщика мусора»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Стек и куча, анализ выхода за пределы стека
- Модель памяти Go и Happens-Before
- Внутреннее устройство сборщика мусора
- Сокращение выделений: sync.Pool и арены