Pure Java – 38 the finalize()

Merhaba Arkadaslar,
Bir onceki yazimizda Java’daki Garbage Collection mekanizmasindan bahsetmistik. Bu yazimda ise bu mekanizma ile iliskili olan ve Object sinifinda bulunan finalize() metodundan bahsedecegim. Object sinifi Java’da sinif hiyerarsisinin tepesinde bulunmaktadir ve tum siniflar Object sinifini kalittigi icin her sinifin ornegi/instance’i bu finalize() metoduna sahip olacaktir.

Object sinifinda finalize metodunu inceledigimizde ;

	protected void finalize() throws Throwable {
	}

seklinde tanimlandigini gorururuz. Ici bos oldugu icin ilgili Sinifta bu metodu override etmemiz gerekir.

  • Garbage Collection mekanizmasi , Garbage Collector(GC) ile Heap’ten ilgili objeyi silmeden once, finalize() metodunu cagirir. Bunun bize ne gibi bir faydasi olabilir, obje silinmeden once yapmamiz gereken bir islem olabilir. Dosya kapatma islemi gibi bir islem olabilir veya silinmek uzere olan (eligible/uygun) objeyi silinmekten kurtarabiliriz (uneligible duruma getirebiliriz)
  • finalize() metodu GC tarafindan sadece bir kez cagrilabilir.
  • Eger GC bir objeyi silmeye karar verdiyse ve finalize() metodu kod icerisinden cagrilmadiysa, GC , finalize() metodunu cagirmayi garanti eder.
  • Hatirlaycagimiz gibi GC her objeyi silmek gibi bir garanti saglamaz. Dolayisiyla finalize() metodu hic calismayabilir.

Ornek bir uygulama yazalim;

public class FinalizeTest {

	public static void main(String[] args) throws Throwable {

		for (int i = 0; i < 4500; i++) {
			new FinalizeTest();
		}

		Runtime.getRuntime().gc();

	}

	@Override
	protected void finalize() throws Throwable {
		System.out.println("hello finalize");
	}
}

Ornek bir cikti ;

hello finalize
hello finalize
hello finalize
hello finalize

FinalizeTest sinifimizda finalize() metodunu override ettik. for dongusunde ise 4500 tane FinalizeTest objesi olusturduk. Daha sonrasinda bir onceki yazida inceledigimiz gc() metodunu cagirdik. Kodu tekrar cagirdiginizda farkli bir sonuc cikabilir hatta gc() metodu cagrilmasi ile hic bir nesne temizlenmemis olabilir. 4500’u arttirarak ekrana daha fazla cikti yazmasini saglayabiliriz.

public class FinalizeTest {

	public static void main(String[] args) throws Throwable {

		for (int i = 0; i < 300000; i++) {
			new FinalizeTest();
		}

		//Runtime.getRuntime().gc();

	}

	@Override
	protected void finalize() throws Throwable {
		System.out.println("hello finalize");
	}
}

gc() metodunu cagirmasak bile bol miktar obje olusturalim ve finalize() metodunun GC tarafindan cagrildigini gorelim.

hello finalize
hello finalize
hello finalize
.............
hello finalize
hello finalize
.......
....... bol miktar hello finalize
hello finalize

Ciktilar  ornegi her calistirdiginizda farkli olabilir.

Bu yazi ile birlikte Bolum 3’un sonuna geldik.Yazimi burada sonlandiriyorum.
Son 2 yazi icin unutmamiz gereken nokta ;

In Java , you cant trust Thread and GC , in life ; women.

Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
injavawetrust

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *