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:
- Üç 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).
- Paralellik (Parallel): İstifadəçi goroutinləri ilə çox nüvəli işləyir, dayanma vaxtını minimuma endirir.
- Əlaqə (Concurrent): Çöp toplayıcının böyük hissəsi proqramın icrası ilə eyni vaxtda həyata keçirilir.
- 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.
- 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.
- 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
GOGCdə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:
- GCstart: Qısa STW mərhələsi. İşarələmə üçün kök obyektlər müəyyən edilir.
- 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.
- GCmarktermination: Qısa STW mərhələsi. İşarələmə tamamlanır və sweep-ə keçid edilir.
- 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.Poolistifadə etmək.