18.02.2010

Java'da Garbage Collector ve finalize() metodu

    C ve C++ dillerinde kodu yazan kişi, ihtiyaçlar durumunda bellekten yerini alır ve kodun ilerleyen bölümlerinde gereksiz değişkenlere ihtiyaç kalmayınca; artık buranın boşaltılması gerekmektedir ve bu değişkenlerin bellekte bulunması sağlıklı bir işlem değildir{hele ki gereksiz değişkenler için ayrılan bellek alanı büyük ve bilgisayarın RAM'i azsa:/}. Dinamik bellek yönetimini yapmak ve belleği daha sağlıklı kullanma işi kodu yazan programcı için takdir edersiniz ki ayrıca bir yüktür, sağolsun Java bu işi ben hallederim demiş olup bizleri bu yükten kurtarmıştır.

 Uygulamada kullanılmayan objelerin Garbage Collector tarafından hafızadan silinmesi büyük kolaylık sağlar, yazılan kodlardaki temel sorunların başında bu temizlik işleminin düzgün yapılmamasını dikkate alırsak kolaylığın yanında kodumuzu daha sağlıklı yazma imkanı da verir.

 Şunu belirtmekte fayda var, yazdığımız uygulamada gereksiz nesnelerin sayısı fazla değilse Garbage Collector çalışmaz, çöp toplayıcının mimarisine göre silinme işlemi değişiklik gösterebilir. Belleğin boyutuna bakar, gereksiz nesnelerin boyutuna bakar mimarisi gereği silinme işlemi gerekli ise hiçbir tetiklemeye gerek kalmadan temizliğe başlar.Eğer biz gereksiz nesnelerin silinmesi konusunda kararlıysak bunu manuel olarak tetikleyebiliriz. System.gc() ile bu tetikleme işlemi gerçekleştirilebilir.System sınıfının statik metodu olan gc() metodu ile çöp toplayıcısı gereksiz nesneleri bulur ve siler. Çöp toplayıcı değişkene bağlı olmayan  nesneleri siler.
   
public class GC {

 public static void main(String args[]) {
  İnsan i = new İnsan(4);
  new İnsan(2);
  System.gc() ;//Garbage Collector çağırıldı..
 }
}
 
  Bu durumda tahmin ettiğiniz gibi i değişkenine bağlı 4 
parametresini gönderdiğimiz İnsan tipindeki nesne silinmezken, diğeri
silinecektir..Kısacası Garbage Collectoru tetiklerken dikkatli olmalıyız.
Eğer değişkene bağlı ise nesnelerimiz sorun yoktur,Çöp toplayıcısı bunu
silmeyeceğini garanti eder; ama değişkene bağlamadıysak sıkıntılar
yaşayabiliriz.
 
  Çöp toplayıcısı gereksiz nesneleri silmeden önce finalize() 
metoduna gider, orada varsa yapılması gerekenler onları da yapar
sonra silme işlemini gerçekleştirir.

 Mesela, uygulama içerisinde C'de de olan malloc() fonksiyonu ile
yerimizi aldık bu durumda bu yerin geri verilmesini 
Garbage Collector yapmaz; çünkü Garbage Collectorun silebildiği
gereksiz nesneler new ile oluşturulan nesnelerdir.

 Nasıl silebiliriz o zaman derseniz, Garbage Collector silmeyi 
yapmadan hemen önce finalize() metodunu çağırıyor
işte bu metodun içinde free() fonksiyonunu kullanırsak
aldığımız alanı geri verip boş duruma getirebiliriz.


Kısa Bilgi: Bilgisayarınızda sistem güncelleştirmesi veya antivirus yüklemesi/kaldıması dışında tekrar başlat demesi durumunda, bu restart işlemine gerek yoktur.
Bunun yerine muhteşem üçlüyü kullanarak Ctrl + alt + delete -> Görev yöneticisi->proceses->explorer.exe'yi kapatıp, File -> new task ile explorer.exe yazmanız yeterlidir.

1 yorum:

  1. Ayni konudaki yazim:
    http://www.kurumsaljava.com/2012/05/17/coplerin-efendisi-garbage-collection/

    YanıtlaSil