Tricolor Garbage Collection Algoritması Nedir?

Sayfayı kopyala
💡 Özet (TL;DR):
- Tricolor Nedir?: Bellekteki (heap) nesneleri Siyah, Gri ve Beyaz olmak üzere üç renk kümesine ayırarak çalışan eşzamanlı (concurrent) bir çöp toplama (garbage collection) algoritmasıdır.
- Go Entegrasyonu: Go, program akışını durdurma süresini (stop-the-world) milisaniyelerin altına indirmek için bu algoritmayı "write barrier" mekanizması ile birlikte eşzamanlı olarak kullanır.
- Temel Mantık: Kök nesnelerden (stack, global vb.) başlanarak ulaşılan tüm aktif nesneler işaretlenir; süreç bittiğinde beyaz kümede kalan (köklerden erişilemeyen) nesneler bellekten silinir.
Bu algoritmayı incelememizin temel sebebi, Go (Golang) dilinin çalışma zamanında (runtime) "Tricolor Mark-and-Sweep" algoritmasını kullanıyor olmasıdır. Go'da bellek yönetiminin arka planda nasıl çalıştığını öğrenirken genel kültürümüzü de artırmış olacağız.
Renk Kümeleri ve Durumları
| Renk | Anlamı | Açıklama |
|---|---|---|
| Siyah (Black) | Canlı / Ziyaret Edilmiş | Kendisine ulaşılan ve tüm alt/bağlı referansları da gri kümesine taşınmış olan kesinlikle canlı nesneler. |
| Gri (Grey) | Ziyaret Edilmekte | Kendisine ulaşılan ancak alt/bağlı referansları henüz taranmamış olan geçiş nesneleri. |
| Beyaz (White) | Aday / Erişilemeyen | Başlangıçta tüm nesneler buradadır. Tarama bittiğinde gri veya siyah olamayanlar bellekten silinir. |
Tricolor Algoritmasının Çalışma Mantığı
Tricolor Garbage Collection (Üç Renkli Çöp Toplama) algoritması, heap bellekte yer alan nesnelerin siyah, beyaz ve gri şeklinde üç gruba ayrılmasına dayanır. Başlangıçta tüm nesneler beyazdır, ancak algoritma çalıştırıldıkça griye ve ardından siyah kümelere taşınırlar.
Süreç adım adım şu şekilde ilerler:
- Başlangıç: Go Garbage Collector çalışmaya başladığında, öncelikle tüm nesneleri Beyaz grupta kabul eder.
- Köklerin Keşfi (Roots): Uygulama tarafından doğrudan erişilebilen kök nesneler (global değişkenler, stack'teki yerel değişkenler, CPU register'larındaki referanslar vb.) taranır ve bu nesneler Gri gruba alınır.
- İşaretleme (Marking Phase):
- Gri gruptan bir nesne seçilir ve rengi Siyah yapılır.
- Bu nesnenin referans gösterdiği (pointer'ı olan) tüm beyaz nesneler tespit edilerek Gri gruba taşınır.
- Bu işlem, gri grupta hiçbir nesne kalmayana kadar döngüsel olarak devam eder.
- Süpürme (Sweep Phase): Gri küme tamamen boşaldığında, köklerden erişilebilen tüm canlı nesneler Siyah kümeye taşınmış olur. Geriye kalan ve hiçbir şekilde erişilemeyen tüm nesneler ise Beyaz kümede kalır. Beyaz kümedeki nesnelerin (kendi aralarında dairesel referansları olsa dahi) tamamı bellekten güvenle temizlenir.
Eşzamanlılık ve Yazma Bariyeri (Write Barrier)
Go'nun çöp toplayıcısı, programın çalışmasını uzun süre durdurmamak (low latency) için program akışıyla eşzamanlı (concurrent) olarak çalışır. Ancak bu durum teknik bir problemi beraberinde getirir: Çöp toplayıcı tarama yaparken, çalışan uygulama programı (mutator) yeni nesne atamaları yapabilir.
Örneğin:
- Taraması bitmiş ve Siyah olarak işaretlenmiş bir nesne, yeni oluşturulan bir Beyaz nesneye referans gösterebilir.
- Aynı anda, bu beyaz nesneyi tutan Gri nesne ile olan bağ kopabilir.
Yazma bariyeri olmasaydı, çöp toplayıcı gri nesneleri tarayıp bitirdiğinde bu beyaz nesneye ulaşamayacak ve onu canlı olmasına rağmen yanlışlıkla bellekten silecekti. Go, bunu önlemek için Yazma Bariyeri (Write Barrier) mekanizmasını kullanır. Program çalışırken bir pointer ataması yapıldığında, yazma bariyeri araya girerek hedeflenen beyaz nesneyi otomatik olarak gri kümesine taşır ve veri kayıplarının önüne geçer.
Bu Algoritmayı Bilmek Neden Önemli?
Amacımız bu algoritmayı sıfırdan yazmak veya özelleştirmek değildir. Ancak Garbage Collector'ün çalışma mantığını tamamen göz ardı edersek, uygulamalarımızdaki düşük performansın veya yüksek bellek (memory leak) kullanımının nedenlerini tespit edemeyiz.
Örneğin, ihtiyacımız kalmayan büyük bir nesne, siyah veya gri kümedeki canlı bir nesne tarafından referans gösterilmeye devam ediyorsa hiçbir zaman beyaz gruba düşmez ve bellekten silinmez. Bellek yönetimini Go bizim yerimize yapsa da, ona doğru referans yapılandırmasını sunarak doğru yolu göstermek bizim işimizdir.
Daha Fazla Öğrenmek İsteyenler İçin
- James Fisher'ın Konuyla İlgili Sunumları
- Ardan Labs - Garbage Collection in Go Part 1
- Vincent Blanchon - Go: How Does the Garbage Collector Mark the Memory?
Bu Yazıda Yapılan Değişiklikler
- 21.06.2026: "İlişkisi kalmayan nesneler silinir" ifadesindeki teknik tanım hatası "kökten erişilemeyen nesneler" olarak düzeltildi. Go'nun eşzamanlı yapısındaki "Yazma Bariyeri" (Write Barrier) mekanizması açıklandı. İmla hataları giderildi, karşılaştırma tablosu ve özet eklendi. Telif uyarısı içeren görsel kredi satırı kaldırıldı.
- 11.05.2022: Yazı özeti düzenlendi.
