Bu makale, C# ile bir .NET çöp toplayıcı (Garbage Collector - GC) geliştirme serisinin altıncı bölümünü oluşturuyor ve "işaretle ve süpür" (mark and sweep) algoritmasının işaretleme (mark) aşamasına odaklanıyor. Ö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 bir nesnenin referanslarının nasıl bulunacağı incelenmişti. Bu bilgiler, çöp toplama işleminin temelini oluşturuyor.
İş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, GC'nin bir toplama işleminin başlangıcında koşulsuz olarak canlı kabul ettiği "köklerden" (roots) başlar. Bu kökler; yerel değişkenler, iş parçacığına özgü depolama alanları, GC handle'ları ve sonlandırma kuyruğu gibi üç ana kategoriye ayrılır. Statik alanlar da GC handle'ları aracılığıyla canlı tutulur.
Çalışma zamanı (runtime), yerel değişkenleri ve iş parçacığı depolama alanlarını doğrudan ele alırken, diğer kökler GC tarafından yönetilir. IGCToCLR arayüzü, her yerel değişken için çağrılacak bir geri çağırma (callback) alan GcScanRoots metodunu sunar. Bu metod, ScanContext adında bir yapı (struct) kullanır. ScanContext içindeki promotion alanı, taramanın nesnelerin üst nesillere taşınması (promotion) veya bellek içi yer değiştirmelerden sonra işaretçilerin güncellenmesi (relocation) için yapılıp yapılmadığını belirtir. Bu detaylar, bir .NET çöp toplayıcısının nasıl çalıştığını ve bellek yönetimini nasıl sağladığını anlamak için kritik öneme sahiptir.
.NET çöp toplayıcısının temel mekanizmalarından biri olan işaretleme aşamasının nasıl çalıştığını ve bellek yönetimindeki kritik rolünü detaylandırıyor.