Algoritma GeliştirmeJAVA ProgramlamaNetbeans KullanımıProgram Dilleri

GARBAGE COLLECTOR ( ÇÖP TOPLAYICI )

image_pdfimage_print

 Merhaba arkadaşlar, bu yazı Java’ da çöp toplayıcı kavramını anlatmak için yazılmıştır. Umarım yararlı olur.

ÇÖP TOPLAYICI NEDİR?

Öncelikle ” Çöp toplayıcı nedir? ” sorusuyla başlayalım; Programda bazı nesnelerin kullanımı bittiğinde bellekten silinmeleri gerekir, nesneye yönelik programlama dillerinde bu işlem otomatik olarak gerçekleşir. Yani programcının müdahalesi gerekmeden hafıza yönetimi gerçekleşir. İşte bunu gerçekleştiren yapı ise çöp toplayıcıdır.  Çöp toplayıcısının temel görevi, kullanılmayan nesneleri bulmak ve hafızadan silmektir.


  • Ancak çöp toplayıcısının ne zaman çöpleri temizleyeceği belli değildir !
  •  Java belirli aralıklarla programı kontrol edip , işi bitmiş ve işaretlenmemiş nesneleri siler. Bu şekilde biriken nesneler programda OutOfMemoryException hatası verir.
  • Eğer bir nesne new anahtar kelimesi ile oluşturup belleğe yerleşmek ister ve bellekte de yer kalmamış olursa; çöp toplayıcı hemen bellekteki gereksiz nesneleri silerek yer ayırır.
  • Nesneler, belleğin heap alanında toplandığı için çöp toplayıcı bu alanda işlem yapar.
  • Çöp toplama isteğini JVM ( Java Virtual Machine ) gönderir.
  • Kullanılmayan nesneleri temizleyerek o alanı belleğe tekrar iade eden çöp toplayıcı otomatik olarak çalışır.

Çöp Toplayıcı Hakkında Bilinmesi Gerekenler

  • Çöp toplayıcının temel görevi , kullanılmayan nesneleri bulmak ve hafızadan silmektir. Ancak çöp toplayıcının ne zaman çöpleri temizleyeceği belli değildir. Bu belirsizlik nedeniyle bazı durumlarda çöp toplama aracını biz programcılar olarak çalıştırmak isteyebiliriz. 
  • Bu araç tetiklense bile, özellikle tetiklenen anda çalışması garanti değildir. Çünkü bu aracın çalışması için bazı durumların olmuş olması gerekiyor. Bu durumların en önemlisi ve ilki ; sanal makine için ayrılan hafızanın  azalmış olması gerekiyor. İkinci durum ise kullanılmayan nesnelerin çoğalmış olması gerekiyor. Bu iki durumun oluşması çöp toplama sistemini otomatik devreye sokacaktır.

Çöp Toplayıcı İşleyişi

  • Çöp toplama yöntemi çeşitlidir. Eski yöntem ve yeni yöntem olarak 2 gruba ayrılabilir.
  • Eski yöntem referans sayma yöntemiyle yapılırdı. Bu yöntemde, bir nesne oluşturulduğunda kendisine ait bir sayaç çalışmaya başlardı. İlgili nesne her kullanıldığında bu sayaç arttırılır, nesnenin yoğun kullanıldığını temsil ederdi. Ve nesneyi kullanan diğer parçalar nesneyle ilişkisini kestiğinde, bu sayaç değeri azalırdı. Bu sayaç değeri ne zaman sıfırlanırsa çöp toplama sistemi tarafından hedef seçilirdi. Çünkü sayacı sıfırlanan nesne kullanılmayan nesnedir.
  • İkinci yöntem ise JVM içinde HOTSPOT ( sıcak bölge ) teknolojisi vardır. Bu teknoloji sayesinde hafızadaki nesneler eski ve yeni grup olarak ikiye ayrılır. Şayet bir nesne zaman içerisinde bir çöp toplayıcı tarafından temizlenmişse , hafıza bölgesindeki eski grup alanına kopyalanır. Çöp toplama aracı genel olarak eski nesnelerin bulunduğu bölümle ilgilendiği için , eski grup alanına kopyalanan çöp nesne temizlenir.
  • Ayrıca çöp toplayıcı referansa bağlı olmayan nesneleri hafızadan siler.
  • new Personel( );   //referans yoktur  
  • Ancak bir nesne referansa bağlı ise çöp toplayıcı bunlara dokunamaz!

System.gc( ) Komutu

Bazı durumlarda çöp toplayıcıyı çağırmamız gerekebilir. Bu durumda System. gc() komut ile istediğimiz zaman çöp toplama aracını tetikleyebiliriz. Tekrar belirtmek gerekirse, bu komut bile çöp toplayıcısının hemen çalışacağını garanti etmez. Ayrıca bu komut yerine Runtime.getRuntime.gc( ) komutunu da kullanabiliriz. Aşağıda bu konuyla ilgili örnek oluşturulmuştur. Örneğimizde Personel adında bir sınıfımız vardır ve bu sınıftan üretilen iki adet nesnemiz vardır. Aynı örnek üzerinden değerlendirme tekrar yapılacaktır.

Örnek:


public static void main( String[] args) {

Personel personel = new Personel();    //nesne oluşturuldu

new Personel();                                        //isimsiz bir nesne oluşturuldu

System.gc();                                             //çöp toplama aracı tetiklendi

}


Örnek Değerlendirme

  • İlk oluşturduğumuz personel nesnesi hafızada yer alacak, kullanılmadığı taktirde hafızadan silinecektir.
  • İkinci oluşturduğumuz personel nesnesi ise isimsizdir yani bir referansa bağlı değildir. Dolayısıyla çöp toplayıcının ilk hedeflerindendir çöp toplayıcı bunu derhal yok edecektir.

Örnek Şekillendirme

 

Çöp toplayıcı devreye girdikten sonra:

 

 

 

Finalize Metodu

  • Biz javada çöp toplayıcının çalışmaya başlayacağı esnada bazı komutlar işletmek isteriz, bunu finalize metodunu kullanarak yaparız.​
  • Finalize metodunun çalışması için sadece çöp toplama aracının devreye girmesi gerekiyor. Yani bizim bu metodu ayrıca çağırmamız gerekmiyor. Çöp toplama aracı devreye girince otomatik olarak bu metot çağrılacaktır ve bloktaki komutlar işleyecektir.

Aşağıda kullanımına ilişkin bir örnek verilmiştir.


public static void main( String[] args) {

Personel personel = new Personel();    //nesne oluşturuldu

new Personel();                                        //isimsiz bir nesne oluşturuldu

System.gc();                                             //çöp toplama aracı tetiklendi

}

public void finalize() {                          //finalize metodu 

System.out.print(“Isimsiz nesne hafızadan siliniyor”);

}


Programda çöp toplama aracı çağrılıyor. Ancak çöp toplama aracı devreye girerse, sınıf içerisinde yazdığınız finalize metodu çalışacaktır. Özellikle System.gc komutu ile tetiklediğimiz halde, uygulamalarda finalize çıktısı oluşmayabilir. Biz çöp toplama aracını çağırmasak da, Personel sınıfına ait nesne silindiğinde finalize metodu çalışacaktır. Tüm anlatılan konuların içinde bulunduğu bir örnekle yazımızı sonlandırıyorum.

Örnek:

Örneğin Ekran Çıktıları:

 

SUNUM

 

HAZIRLAYAN:

Beyza Nur Kılıç

Kaynakça: Kodlab – Java 8

  [contact-form][contact-field label=’İsim’ type=’name’ required=’1’/][contact-field label=’E-Posta’ type=’email’ required=’1’/][contact-field label=’Web Sitesi’ type=’url’/][contact-field label=’Yorum’ type=’textarea’ required=’1’/][/contact-form]

 

 

0
0

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir