Какой механизм использует сборщик мусора (Garbage Collector) в Go?

Ответ

Сборщик мусора (GC) в Go использует конкурентный (concurrent) трехцветный алгоритм пометки и очистки (mark-and-sweep).

Ключевые особенности:


  1. Конкурентность: Большая часть работы GC (пометка и очистка) выполняется одновременно с основной программой, а не останавливая её. Это обеспечивает очень короткие паузы.


  2. Трехцветный алгоритм: Объекты в памяти условно делятся на три цвета:

    • Белые: Кандидаты на удаление (изначально все объекты белые).
    • Серые: Достижимые объекты, но ссылки из них еще не проверены.
    • Черные: Достижимые объекты, все ссылки из них проверены.

      GC "перекрашивает" объекты из белых в серые, а затем в черные, начиная с корневых объектов (глобальные переменные, стеки горутин).

  3. Минимальные паузы "Stop-The-World" (STW): Программа полностью останавливается лишь на очень короткие промежутки времени (обычно меньше миллисекунды) для выполнения операций, которые нельзя сделать конкурентно, например, для включения барьера записи (write barrier) в начале цикла.



  4. Отсутствие поколений (Non-generational): В отличие от GC в Java или .NET, сборщик мусора в Go не делит объекты на "молодые" и "старые" поколения. Он каждый раз сканирует всю кучу.



  5. Управление: Поведением GC можно управлять с помощью переменной окружения GOGC. Она устанавливает процент роста кучи, который запускает следующий цикл сборки мусора. GOGC=100 (значение по умолчанию) означает, что новый цикл GC начнется, когда размер кучи увеличится на 100% по сравнению с размером после предыдущей сборки.