Сборщик мусора в Go реализует параллельный, неточный (non-generational) метод, основанный на алгоритме Mark-and-Sweep с триггером по объему кучи.
Основные принципы работы:
- Триггер активации: Сборщик запускается, когда объем выделенной программой памяти превышает определенный порог. Этот порог динамически регулируется.
- Mark Phase (Фаза пометки):
- Сборщик приостанавливает выполнение только критически важной части Mark Phase (Stop-the-World, STW), но это занимает очень короткое время.
- Параллельно с работающей программой (mutator) сборщик обходит граф объектов из корневых указателей (регистры, глобальные переменные, стеки горутин).
- Достижимые (живые) объекты помечаются как используемые.
- Sweep Phase (Фаза очистки):
- После завершения Mark Phase, сборщик проходит по списку аренд памяти (spans).
- Непомеченные объекты считаются мусором и их память освобождается.
- Эта фаза также выполняется параллельно с работой программы.
- Write Barrier: Go использует write barrier для отслеживания изменений в графе объектов во время параллельной фазы пометки. Это гарантирует корректную работу сборщика, несмотря на модификации памяти мутатором.
- Нет поколений: В отличие от некоторых других языков, Go не делит объекты на