Çöp Toplayıcı Sistem (Garbage Collector)

Anımsanacağı gibi yerel değişkenlerin hepsi stack’te yaratılır. Bunların yaratılmaları ve yokedilmeleri çok hızlıdır. Akış bloktan çıkarken, o blokta bildirilmiş tüm yerel değişkenler yokedilir.
new ile heap’te yarattığımız sınıf nesneleri nasıl yokedilmektedir? C++’ta yoketme için delete isimli ayrı bir operatör kullanılmaktadır. Fakat C# ve Java’da bu işlem otomatik yapılmaktadır. new ile yaratılan her nesneyi belli bir zamanda, belli bir sayıda referans göstermektedir. Buna nesnenin referans sayacı denir.
Bir nesnenin referans sayacının sıfıra düşmesi demek, artık o nesneyi hiçbir referansın göstermemesi demektir. Hiçbir referans tarafından gösterilmeyen nesneler artık şöp durumundadır. İşte CLR içerisindeki çöp toplayıcı (Garbage Collector) denilen alt sistem her nesnenin kaç referans tarafından gösterildiğini izler, nesnenin referans sayacı sıfıra düştüğünde onu siler. Yani nesnenin yaratımını programcı yapar fakat silme işlemi otomatik yapılmaktadır.
Bir nesnenin referans sayacı sıfıra düştüğünde artık nesne çöp toplayıcı için seçilebilir (eligible) duruma gelir. Seçilebilir duruma gelen nesneler çöp toplayıcı sistemin uygun gördüğü bir zamanda bellekten silinirler. Yani silme işleminin nesnenin referans sayacı sıfıra düşer düşmez yapılacağı konusunda bir garanti verilmemektedir. Çöp toplama işlemi uygun bir zamanda yapılmaktadır. Şüphesiz iyi bir çöp toplayıcı sistemin çok fazla beklemeden toplama işlemini yapması istenir.
Çöp toplama işlemleri için system isim alanında GC sınıfı vardır. GC sınıfının collect isimli static metodu o anda çöp toplayıcıyı göreve davet ederek çöp toplama işlemini yapar. Fakat bu metodun çağrılması ancak özel durumlarda tavsiye edilmektedir.

null Referans Kavramı

Herhangi bir değişkene henüz değer atamadan onu içerisindeki değerin kullanıldığı bir ifadede kullanamayız. Bu durum referanslar içinde söz konusudur.

C#’ta null anahtar sözcüğü hiçbir nesneyi belirtmeyen referans anlamına gelir. Biz null değerini herhangi bir türden referansa atayabiliriz. İçerisinde null değeri bulunan bir referansı kullandığımızda hata derleme aşamasında oluşmaz. Programın çalışma zamanı sırasında akış kullanım noktasına geldiğinde exception oluşur.

null referansa neden gereksinim duyulmuştur? C#’ta bazen null referansın kullanılması gerekmektedir. Örneğin bir referansa null değerini atadıktan sonra artık o referansın gösterdiği yerdeki nesne çöp toplayıcı tarafından seçilebilir duruma gelebilir.

Şüphesiz null referans değer türlerine atanamaz. Yani örneğin biz int bir değişkene null referans atayamayız.

Leave a Reply

Site Footer