После того как программа зафиксировала одну из вышеуказанных причин, запускается GC и проходит память в два этапа, не останавливая программу целиком.
1. Разметка (Mark)Сначала GC определяет, какие объекты всё ещё используются программой. Он начинает с корней:
- глобальные переменные,
- стеки всех горутин,
- внутренние структуры runtime.
Далее GC проходит по ссылкам между объектами. Если до объекта можно добраться из выполняющегося кода, он помечается как «живой». Из него GC идёт дальше по ссылкам, постепенно помечая все необходимые объекты.
Большая часть этой работы выполняется параллельно с кодом приложения, поэтому программа продолжает работать во время сборки мусора.
2. Очистка (Sweep)Когда разметка завершена, все помеченные объекты остаются в памяти, а непомеченные считаются мусором
GC освобождает память и подготавливает её для повторного использования внутри программы или для операционной системы.
Короткие остановки приложенияБольшая часть работы идёт параллельно с программой, но в некоторых моментах могут быть паузы на миллисекунды, чтобы гарантировать корректность данных.