Bu makale, C# ile bir .NET çöp toplayıcı (GC) oluşturma serisinin altıncı bölümüdür ve "işaretle ve süpür" (Mark and Sweep) algoritmasının işaretleme (mark) aşamasına odaklanmaktadır. Önceki bölümlerde, basit bir uygulamanın çalışmasına izin veren minimal GC API'lerinin nasıl uygulanacağı, nesnelerin bellekte nasıl düzenleneceği ve yönetilen yığındaki (managed heap) nesnelerin referanslarının nasıl bulunacağı incelenmişti. Bu bilgilerle birlikte, artık çöp toplamanın işaretleme aşamasını uygulamak için gerekli tüm parçalar bir araya gelmiştir. İşaretleme aşamasının temel amacı, kullanıcı kodu tarafından erişilebilir olan tüm nesneleri bulmak ve böylece artık erişilemeyen, dolayısıyla serbest bırakılabilecek nesneleri belirlemektir.
İşaretleme süreci "köklerden" başlar. Kökler, çöp toplama başlangıcında koşulsuz olarak canlı kabul edilen referanslardır. Bu kökler üç ana kategoriye ayrılır: yerel değişkenler ve iş parçacığına özgü depolama alanları (thread-static storage), GC handle'ları ve sonlandırma kuyruğu (finalization queue). Statik alanlar da akla gelebilir, ancak pratikte statik değişkenler GC handle'ları aracılığıyla canlı tutulur. İlk kategori (yerel değişkenler) çalışma zamanı (runtime) tarafından doğrudan ele alınırken, diğer iki kategori GC'nin sorumluluğundadır. Çalışma zamanı, IGCToCLR arayüzü aracılığıyla GcScanRoots adında bir metot sunar. Bu metot, her yerel değişken için çağrılacak bir geri çağırma (callback) işlevi alır ve ScanContext adında bir yapı kullanır.
ScanContext yapısındaki alanların çoğu sunucu GC'si için daha faydalı olsa da, promotion alanı bu uygulamada önemlidir. promotion alanı, yürütme motoruna taramanın yükseltme (promotion) için mi (nesnelerin üst nesillere taşınacağı durum) yoksa yeniden konumlandırma (relocation) için mi (nesnelerin bellekte taşınmasından sonra işaretçileri güncelleme) yapıldığını bildirir. Bu, özellikle muhafazakar mod etkinleştirildiğinde hangi köklerin raporlandığını etkiler. Şimdilik bu durumun mevcut uygulamayı doğrudan etkilemeyeceği belirtilse de, promotion değeri true olarak ayarlanacaktır. Bu aşamalar, bir .NET uygulamasının bellek yönetimini optimize etmek ve gereksiz nesnelerin belleği işgal etmesini önlemek için kritik öneme sahiptir.
.NET uygulamalarında bellek yönetiminin temelini oluşturan çöp toplayıcıların nasıl çalıştığını anlamak, performans optimizasyonu ve kaynak kullanımını iyileştirmek için kritik bilgiler sunar.