Sobes.tech
Middle+

Go tilida axlat yig'uvchi qanday ishlaydi?

sobes.tech AI

AIdan javob

Go'da çöp toplayıcı, paralel, qeyri-dəqiq (non-generational) metod tətbiq edir və bu, Mark-and-Sweep algoritminə əsaslanır; bu algoritm, yığın həcmi əsasında tetiklenir.

Əsas iş prinsipləri:

  1. Tetikleyici: Çöp toplayıcı, proqram tərəfindən ayrılmış yaddaş həcmi müəyyən bir həddi aşdıqda işə düşür və bu hədd dinamik olaraq tənzimlənir.
  2. İşarələmə mərhələsi (Mark Phase):
    • Çöp toplayıcı, yalnız kritik Mark mərhələsini dayandırır (Stop-the-World, STW), amma bu çox qısa müddət çəkir.
    • Paralel olaraq, işləyən proqramla (mutator) obyekt qrafını kök göstəricilərdən (reyestrlər, qlobal dəyişənlər, goroutine yığınları) keçir.
    • Əldə olunan (canlı) obyektlər istifadə olunmuş kimi işarələnir.
  3. Təmizləmə mərhələsi (Sweep Phase):
    • Mark mərhələsi tamamlandıqdan sonra, yaddaş spanləri siyahısı keçilir.
    • İşarələnməyən obyektlər zibildir və onların yaddaşı azad edilir.
    • Bu mərhələ də proqramın işləməsi ilə paralel olaraq həyata keçirilir.
  4. Yazı Bariyeri (Write Barrier): Go, paralel mark mərhələsi zamanı obyekt qrafındakı dəyişiklikləri izləmək üçün yazı bariyerindən istifadə edir. Bu, mutator tərəfindən edilən yaddaş dəyişikliklərinə baxmayaraq, toplayıcının düzgün işləməsini təmin edir.
  5. Nəsil yoxdur: Bəzi digər dillərdən fərqli olaraq, Go obyektləri nəsil kimi bölünmür. Toplayıcı bütün yığını bir yerdə işləyir.
  6. Aşağı gecikmə məqsədi: Go GC dizaynında, çöp toplanması (STW) səbəbindən yaranan gecikmələri minimuma endirmək məqsədi qoyulmuşdur və bu, server tətbiqləri üçün uyğundur.

Paralelləşmə və yazı bariyerinin istifadəsi, toplayıcının proqram dayanmalarını minimuma endirməsinə və yüksək performans təmin etməsinə imkan verir.

Sadələşdirilmiş yaddaş idarəetmə nümunəsi (birbaşa GC deyil, amma resursların azad edilməsini göstərir):

package main

import (
	"fmt"
	"os"
)

func main() {
	// Müvəqqəti resursun yaradılması və azad olunması nümunəsi
	file, err := os.Create("temp.txt")
	if err != nil {
		fmt.Println("Fayl yaradılmasında xəta:", err)
		return
	}
	// Faylın gecikmiş bağlanması.
	// Bu, birbaşa GC olmasa da, resursların azad edilməsini göstərir.
	defer file.Close()

	fmt.Println("'temp.txt' faylı yaradıldı.")

	// Daha sonra proqram fayl ilə işləyə bilər...

	// GC avtomatik olaraq fon rejimində işləyir və istifadə olunmayan obyektləri yığından toplayır.
	// Məsələn, bir dilim və ya xəritə yaradılırsa:
	data := make([]int, 1000000) // Yaddaş ayırması
	_ = data // İstifadə

	// Data əlçatan olmadıqda (məsələn, funksiyadan çıxarkən),
	// çöp toplayıcı zamanla ayırılmış yaddaşı azad edəcək.
}