Sobes.tech
Middle+

Как работи събирачът на боклук в езика за програмиране Go?

sobes.tech AI

Отговор от AI

Събирачът на боклук в Go се базира на алгоритъм за маркиране и почистване с тригер, основан на разпределението на паметта. Той работи паралелно с основната програма и минимизира паузите.

Ключови моменти:

  • Три набора от цветове:
    • Бял: Обекти, които не са посетени и потенциално са боклук.
    • Сив: Обекти, достъпни от корените, но все още не са сканирани.
    • Черен: Обекти, достъпни от корените и вече сканирани.
  • Маркиране: Събирачът започва от корените (глобални променливи, стек на всяка горутина), маркирайки достъпните обекти като сиви. След това рекурсивно сканира сивите обекти, маркирайки като сиви тези, до които са достъпни, а сканираните обекти стават черни.
  • Фаза STW (Stop-The-World) по време на маркирането: Кратко спиране на изпълнението на всички горутини в началото на маркирането за създаване на моментна снимка на графа на обектите и в края за смяна на състоянието.
  • Паралелно маркиране: Повечето от маркирането се извършва паралелно с работата на програмата.
  • Премахване: След маркирането всички останали бели обекти се считат за недостъпни и се освобождават. Go не изисква явно нулиране на указателите.
// Пример: когато обект стане недостъпен
type Data struct {
    value int
}

func main() {
    d1 := &Data{value: 10} // Обект създаден, достъпен
    _ = d1                 // Използване на обекта

    d1 = nil // Обектът вече не е достъпен чрез променливата d1.
            // Събирачът може да го освободи при следващия цикъл.

    // Други обекти, към които никой не сочи, също могат да бъдат събрани.
}
  • Тригър: Събирачът се активира, когато обемът на заделената памет надвиши определен праг, зависим от предишния обем. По подразбиране този праг е два пъти по-голям от предишната използвана памет.
  • Цел: Поддържане на ниска латентност, като се избягват дълги паузи "Stop-The-World".
// Може да се управлява поведението на събирача чрез променливи на средата
// например, като се зададе GOGC=off, събирането на боклук се деактивира.

Общо взето, събирачът на боклук в Go е ефективен и изисква минимално участие от разработчика.