Sobes.tech
Middle

Go dilində çöp toplayıcı haqqında bilikləriniz nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Golang, aşağı gecikmeli paralel və mark-sweep algoritm əsasında işləyən çöp toplayıcıdan istifadə edir.

Əsas xüsusiyyətlər:

  1. Üç rəng algoritmi (Three-color algorithm): Ob'ektləri üç rənglə işarələyir: ağ (potensial çöp), boz (əldə olunan obyekt, lakin onun törəmələri yoxlanmayıb) və qara (əldə olunan obyekt və onun törəmələri).
  2. Paralellik (Parallel): İstifadəçi goroutinləri ilə çox nüvəli işləyir, dayanma vaxtını minimuma endirir.
  3. Əlaqə (Concurrent): Çöp toplayıcının böyük hissəsi proqramın icrası ilə eyni vaxtda həyata keçirilir.
  4. Aşağı gecikməli dayanma vaxtı (Low-latency Stop-The-World): Bütün goroutinlərin dayanma vaxtı (STW) çox qısadır və yalnız "işarələmənin başlanğıcı" (start of marking) və "işarələmənin sonu" (end of marking) mərhələlərində istifadə olunur, obyekt qrafiklərinin uyğunluğunu təmin etmək üçün.
  5. Yenidən istifadə edilə bilən yığın skaneri (Stack scanning): Yığın skaneri də paralel və eyni zamanda STW ilə həyata keçirilir.
  6. Heap artım hədəfi (Heap growth target): GC hər dövrdən sonra heap-in müəyyən faizini saxlamağa çalışır, çox tez və ya çox nadir dövrlərdən qaçınmaq üçün. Bu həddi GOGC dəyişəni ilə idarə etmək mümkündür. Standart olaraq, GOGC=100-dir, bu da heap ölçüsü ikiqat artanda GC-nin işə düşdüyünü göstərir.

GC-nin iş dövrü aşağıdakı mərhələlərdən ibarətdir:

  1. GCstart: Qısa STW mərhələsi. İşarələmə üçün kök obyektlər müəyyən edilir.
  2. GCmark: Əlaqəli mərhələ. GC obyekt qrafını keçir və əlçatan obyektləri (boz rəng -> qara) işarələyir. İşarələmə zamanı qrafdakı dəyişiklikləri izləmək üçün write barrier istifadə olunur.
  3. GCmarktermination: Qısa STW mərhələsi. İşarələmə tamamlanır və sweep-ə keçid edilir.
  4. GCsweep: Əlaqəli mərhələ. Əlçatan olmayan (ağ) obyektlər sərbəst buraxılır. Bu mərhələ fon rejimində və ya yeni yaddaş ayırma zamanı lazım olduqda həyata keçirilə bilər.

Go-da GC avtomatik idarə olunur və əksər hallarda əl ilə çağırış tələb etmir. GC performansı GODEBUG=gctrace=1 mühit dəyişənləri ilə izlənə bilər.

İzləmə nümunəsi:

$ GODEBUG=gctrace=1 go run your_program.go

gctrace çıxışı hər GC dövrü haqqında mərhələ vaxtları, heap ölçüsü və STW vaxtını göstərir.

GC-ni optimallaşdırmaq üçün, GOGC ayarını tənzimləməkdən əlavə, aşağıdakıları nəzərdən keçirmək olar:

  • Ayırmaların sayını azaltmaq (məsələn, bufferləri yenidən istifadə etmək, lazımsız çevirmələri qarşısını almaq).
  • "escape analysis" profilini istifadə etmək, hansı obyektlərin heap-ə ayrıldığını anlamaq.
  • Tez-tez yaradılan və sərbəst buraxılan obyektlər üçün sync.Pool istifadə etmək.