Middle
Go dilinde çöp toplayıcı hakkında bilginiz nedir?
sobes.tech yapay zeka
AI'dan gelen yanıt
Golang, düşük gecikmeli paralel ve mark-sweep algoritmasına dayalı bir çöp toplayıcı kullanır.
Ana özellikler:
- Üç renk algoritması (Three-color algorithm): Nesneleri üç renkle işaretler: beyaz (potansiyel çöp), gri (erişilebilir nesne, ancak torunları incelenmemiş) ve siyah (erişilebilir nesne ve torunları).
- Paralellik (Parallel): Çok çekirdekli kullanıcı goroutine'leriyle paralel çalışır, durma süresini en aza indirir.
- Eşzamanlılık (Concurrent): Çöp toplayıcının büyük kısmı program çalışırken aynı anda gerçekleştirilir.
- Düşük gecikmeli durma zamanı (Low-latency Stop-The-World): Tüm goroutine'lerin durma süresi (STW) son derece kısadır ve sadece "işaretleme başlangıcı" (start of marking) ve "işaretleme sonu" (end of marking) aşamalarında kullanılır, nesne grafiğinin tutarlılığını sağlamak için.
- Yeniden kullanılabilir yığın taraması (Stack scanning): Yığın taraması da paralel ve STW ile eşzamanlı olarak gerçekleştirilir.
- Heap büyüme hedefi (Heap growth target): GC, her döngüden sonra belirli bir yüzdeyle heap'in doluluk oranını korumaya çalışır, böylece çok sık veya çok seyrek döngülerden kaçınılır. Bu eşik
GOGCdeğişkeniyle kontrol edilebilir. Varsayılan olarak,GOGC=100olup, bu da heap boyutu iki katına çıktığında GC'nin tetiklendiği anlamına gelir.
GC çalışma döngüsü aşağıdaki aşamalardan oluşur:
- GCstart: Kısa STW aşaması. İşaretleme için kök nesneler belirlenir.
- GCmark: Eşzamanlı aşama. GC, nesne grafını dolaşır ve erişilebilir nesneleri (gri renk -> siyah) işaretler. İşaretleme sırasında grafikteki değişiklikleri izlemek için write barrier kullanılır.
- GCmarktermination: Kısa STW aşaması. İşaretleme tamamlanır ve sweep'e geçilir.
- GCsweep: Eşzamanlı aşama. Erişilemeyen (beyaz) nesneler serbest bırakılır. Bu aşama arka planda veya yeni bellek tahsisi sırasında gerekirse gerçekleşir.
Go'daki GC otomatik olarak yönetilir ve çoğu durumda manuel çağrı gerekmez. GC performansı, GODEBUG=gctrace=1 ortam değişkenleri kullanılarak izlenebilir.
İzleme örneği:
$ GODEBUG=gctrace=1 go run your_program.go
gctrace çıktısı, her GC döngüsü hakkında aşama süreleri, heap boyutu ve STW süresi gibi bilgileri gösterir.
GC'yi optimize etmek için, GOGC ayarının yanı sıra şu adımlar da düşünülebilir:
- Tahsisleri azaltmak (örneğin, tamponları yeniden kullanmak, gereksiz dönüşümleri önlemek).
- "escape analysis" profilini kullanmak, hangi nesnelerin heap'e tahsis edildiğini anlamak.
- Sık oluşturulan ve serbest bırakılan nesneler için
sync.Poolkullanmak.