Sobes.tech
Middle

C#'ta çöp toplama kavramı nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Çöp Toplayıcı (GC) belleği otomatik olarak yönetir, program tarafından artık kullanılmayan nesnelerden kurtarır. Otomatik modda çalışır, bu da bellek tahsisi ve serbest bırakma işlemlerinin manuel yönetimine gerek kalmadığı anlamına gelir, böylece bellek sızıntısı ve göstergeciyle ilgili hatalar riski azalır.

Çöp toplama süreci aşağıdaki aşamaları içerir:

  1. İşaretleme (Marking): GC, hangi nesnelerin hâlâ kullanıldığını belirler. Bunun için, kök nesneler kümesiyle başlar (örneğin, küresel değişkenler veya mevcut iş parçacıklarının yığınlarındaki nesneler) ve onlardan erişilebilen tüm nesneleri işaretler.
  2. Kompaktasyon (Compacting): GC, hayatta kalan nesneleri bellekte hareket ettirerek, yeni bellek için ardışık bloklar serbest bırakır. Bu aşama ayrıca taşınan nesnelere işaretçileri günceller.
  3. Temizleme (Sweeping): GC, kullanılmayan olarak işaretlenmiş nesnelerin kapladığı belleği serbest bırakır.

.NET'teki GC jenerasyoneldir. Bellek nesillere ayrılmıştır:

  • Jenerasyon 0 (Gen 0): Kısa ömürlü nesneleri içerir. Bu jenerasyonun toplanması genellikle daha sık gerçekleşir.
  • Jenerasyon 1 (Gen 1): Gen 0 toplanmasından sonra hayatta kalan nesneler için tampon görevi görür. Gen 0'dan daha az sıklıkla toplanır.
  • Jenerasyon 2 (Gen 2): Uzun ömürlü nesneleri içerir. En az toplanır ve daha yüksek performans gerektirir.

Nesneler, "hayatta kalma" durumlarına göre jenerasyonlar arasında hareket eder.

Örneğin, bir nesnenin oluşturulması ve kullanımı:

// Nesne oluşturma
MyObject obj = new MyObject();
// Nesne kullanımı
obj.DoSomething();
// Nesne artık kullanılmıyor, GC onu toplayabilir
obj = null;

Zorunlu çöp toplama çağrısı GC.Collect() ile yapılabilir, ancak genellikle önerilmez çünkü GC, toplama zamanını otomatik olarak optimize eder.

// Zorunlu çöp toplama (çoğu durumda önerilmez)
GC.Collect();
GC.WaitForPendingFinalizers(); // Finalizer'ların tamamlanmasını bekle