Middle+
Go programlama dilinde çöp toplayıcı nasıl çalışır?
sobes.tech yapay zeka
AI'dan gelen yanıt
Go'daki çöp toplayıcı, işaretleme ve temizleme algoritmasına dayanır ve bellek tahsisine göre tetiklenir. Ana programla paralel çalışır ve duraklamaları en aza indirir.
Anahtar noktalar:
- Üç renk kümesi:
- Beyaz: Ziyaret edilmemiş ve potansiyel olarak çöp olan nesneler.
- Gri: Köklerden erişilebilir, ancak henüz taranmamış nesneler.
- Siyah: Köklerden erişilebilir ve zaten taranmış nesneler.
- İşaretleme: Çöp toplayıcı, köklerden (küresel değişkenler, her goroutine'in yığını) başlar ve erişilebilir nesneleri gri olarak işaretler. Daha sonra, gri nesneleri rekürsif olarak tarar, onlardan erişilebilenleri gri yapar ve taranan nesneleri siyah yapar.
- STW (Durdur-Dünyayı) aşaması (İşaretleme sırasında): İşaretlemenin başlangıcında ve sonunda, nesne grafiğinin anlık görüntüsünü oluşturmak ve durumu değiştirmek için tüm goroutine'lerin yürütülmesi kısa süre durdurulur.
- Paralel işaretleme: İşaretlemenin büyük kısmı program çalışırken paralel olarak gerçekleştirilir.
- Temizlik: İşaretlemeden sonra, kalan beyaz nesneler erişilemez kabul edilir ve serbest bırakılır. Go, göstericilerin açıkça sıfırlanmasını gerektirmez.
// Örnek: Nesne erişilemez hale geldiğinde
type Data struct {
value int
}
func main() {
d1 := &Data{value: 10} // Nesne oluşturuldu, erişilebilir
_ = d1 // Nesne kullanımı
d1 = nil // Nesne artık d1 değişkeninden erişilebilir değil.
// Çöp toplayıcı, bir sonraki döngüde serbest bırakabilir.
// Hiç kimseye referans olmayan diğer nesneler de toplanabilir.
}
- Tetikleyici: Çöp toplayıcı, tahsis edilen bellek miktarı, önceki tahsis edilen bellek miktarını aşarsa tetiklenir. Varsayılan olarak, bu eşik, önceki kullanımın iki katıdır.
- Hedef: Uzun "Durdur-Dünyayı" duraklamalarını önleyerek düşük gecikmeyi korumak.
// Çöp toplayıcının davranışı, ortam değişkenleri aracılığıyla kontrol edilebilir
// Örneğin, GOGC=off ayarlanırsa, çöp toplayıcı devre dışı bırakılır.
Genel olarak, Go'nun çöp toplayıcısı etkilidir ve geliştiricinin minimum katılımını gerektirir.