Dr. Volkan Tunalı'nın Kişisel Blogu

Bilgisayar, Teknoloji, Bilim, Sanat

Archive for the ‘çöp toplayıcı’ tag

Garbage Collector (Çöp Toplayıcı) Üzerine

one comment

Mesai arkadaşlarımızla özellikle de Delphi geçmişi olan arkadaşlarımızla .Net Framework’ünün önemli özelliklerinden biri olan Garbage Collector (GC / Çöp Toplayıcı) üzerine zaman zaman tartışmalar yapıyoruz. Tartışmalarda en çok, eskiden olduğu gibi Create-Free ikilisini .Net uygulamalarında da kullanmanın bir yararının olup olmayacağı sorusu gündeme geliyor. Devamında şu sorulara yanıt aranıyor;

  • GC ne kadar güvenilir?
  • Ne kadar sıklıkla temizlik yapıyor?
  • Sistemi çok meşgul etmiyor mu?
  • Bir sürü nesne yaratılıyor, form açılıyor, kapanıyor, bunların temizliğini GC’ye mi bırakacağız?

Üniversitedeyken Java’nın orijinal kütüphanelerinin kodlarını incelediğimde de mesela dizilerle ilgili statik metodlarda sıklıkla “bırakalım gerisini GC halletsin” şeklinde yorumlara rastlamış ve bunu derste hocamızla tartışmıştım. Tartışmamızın sonucunda Garbage Collector özelliği olan bir dil/sistem kullanıyorsak buna güvenmekten ve kodlarımızda bunun verdiği rahatlığı kullanmaktan daha doğal birşey olmayacağı sonucuna varmıştık.

Yani sonuç olarak .Net’in sunduğu Garbage Collector bizi managed olmak koşuluyla hafıza yönetimi ve kaynak geri dönüşümüyle ilgili her türlü sıkıntıdan kurtarıyor. Artık create-free çevrimine çok fazla takılmadan kodumuzun asıl yapacağı işe odaklanabiliriz.

Garbage Collector hakkında MSDN’de de bir miktar bilgi bulabilirsiniz.

—————————————–

Bu konu ile ilgili Tess Ferrandez’in MSDN’deki blog’unda bir quiz ve bu quiz’in cevapları var.

Bazıları biraz daha derine iniyor ama mesela ilk bakışta benim ilgimi çeken ve pratik olarak yararlı bulduğum bir tanesini buraya alıntılamak istiyorum.

12. Why is it important to close database connections and dispose of objects? Doesn’t the GC take care of that for me?

I think pretty much all of you got this one:) To paraphrase Arnaud, “The finalizer will eventually be called, after the object has been made available for garbage collection. Knowing that there may be quite some time until an object gets GC’ed, and that many resources are limited, you call Dispose yourself as soon as you’re over with an object. It doesn’t get GC’d when you call Dispose, but it releases its resources.”

Hızlıca bir çevirecek olursak;
Soru: İşimiz bittiğinde veritabanı bağlantılarını kapatmak ve ilgili nesneleri Dispose etmek neden önemlidir? GC bütün temizlik işini bizim yerimize zaten halletmiyor mu?
Cevap: İlgili nesne GC için uygun hale geldiğinde eninde sonunda GC tarafından temizlenecek. Ancak GC’nin bunu yapması için oldukça uzun bir zaman geçebilir. Veritabanı bağlantısı gibi kaynaklar sınırlı sayıda olduğunda Dispose çağrısı yaparak işimiz bittiğinde kaynakları elimizden çıkartmak gerekir. Şu da var ki Dispose çağrısı yaptığımızda GC tarafından hemen temizlik yapılmaz, sadece bize ayrılmış kaynaklar serbest bırakılır.

Sonuç olarak, IDisposable arabirimini destekleyen sınıflarda Dispose metoduyla temizlik yapmak –özellikle de veritabanı bağlantısı gibi nispeten daha sınırlı kaynaklar için– iyi bir alışkanlık gibi görünüyor. Zaten çoğumuz veritabanı bağlantısı ile ilgili olarak Dispose’un otomatik çağrılmasını sağlayan using bloğunu kullanıyoruzdur.

Written by vtunali

Eylül 24th, 2009 at 2:38 pm