Sunday, October 17, 2010

Garbage Collector nedir?

 Bu yazi http://www.cemkefeli.com/post/2009/10/02/JAVA-Garbage-Collector-nedir.aspx bu blogtan kopyalanmistir yazan hocamizin ellerine saglik...
JAVA - Garbage Collector nedir?
by Cem Kefeli
2. Ekim 2009 04:19

Herhalde birçoğumuz o meşhur "Segmentation Fault" hatası ile karşılaşmışızdır. Hatanın isminin zaten başlı başına can sıkıcı olması bir yana bir de üstüne üstlük hata nerede? hani ne oldu? nerede problem? gibi soruların bir çoğunu da oldukça canınız sıkıldıktan sonra cevaplamanız mümkün olabilecektir. Bu iş en çok da C/C++ kullanırken başınıza gelecektir. Çünkü C/C++ da bellek yönetimi tamamen uygulama geliştiricilerin tasarrufuna bırakılmıştır. Yani siz sisteminizin belleğinin bir byte'lık bir gözüne dahi istediğiniz gibi erişebilirsiniz. Bunun bizim için münkün olmasını sağlayan olay pointer(işaretçi) kavramıdır. İşaretçiler ile istediğimiz gibi istediğimiz her yere erişebiliriz. Zaten sorunlara yol açan olaylar da tam olarak burada başlıyor. İstediğimiz yerlere erişiyoruz ama bazen de erişmememiz gereken bir yere erişme imkanı da veriyor bize. Hiç bir kontrol de yapılmıyor derleyici tarafından. Yani 'arkadaşım sen buraya erişmeye çalışıyorsun ama bak burası başkası tarafından kullanılıyor, ya da senin sınırlarının dışında.' gibi bir hata ile bizi uyarmıyor. İşi tamamen bizim bilincimize bırakmış durumda. Çok bilinçli kullanılması gereken bir bellek yönetimine sahip olmak gerekiyor. Bir yandan güzel bir yandan kötü bir özellik. Olayın bir başka yönü ise oluşturduğumuz nesnelerin kullanılmadıkça bir kenarda birikmesi ve bir süre sonra bellek sızıntısı(Memory Leak)'na yol açması. Bu olay C/C++ kullanan bir çok yazılımda, işletim sistemleri dahil, sık görülen birşeydir. Nesneleri oluşturup önerildiği şekilde uygun yollar ile bellek alanlarını boşaltmazsanız sağda solda birikirler ve gereksiz yer kaplayıp işletim sistemini felakete sürükleyebilirler. Bu olay dinamik bellek yönetimi olarak adlandırılmaktadır.

Bu olaya seneler önce ilk olarak java el attı. Dedi ki: 'Ben nesneye yönelik bir yazılım dili olduğuma göre böyle şeyler ile ilgilenmem. İşaretçi kavramı filan benim için yoktur. Benim gözümde herşey nesnedir. Dolayısı ile bellekte nesneler tutulur. Bellek yönetimine gelince o konuda da yazılımcıların işini çok kolaylaştıracak birşey sunuyorum. O da Garbage Collector(Çöp Toplayıcı)...'. Bu fikir seneler sonra C# tarafından da hemen benimsendi tabi ki. Birçok örneği olduğu gibi Microsoft bu güzelliği gözden kaçırmadı ve kendi .NET Framework yapısı içerisine dahil etti.

Garbage Collector(GC)'ın yaptığı iş temel olarak; kullanımı son bulmuş, hiçbir nesne örneği tarafından referans gösterilmeyen, bellek bölgelerini tesipit edip o bölgelerdeki bellek alanını boşaltmaktır. GC sizin yerinize yazılımınızı takip eder ve kullanılmaya bellek bölgelerini sisteme iade eder. Bu Java'da asla bellek sızıntısı olmadığı anlamına gelmez tabi ki ama daha öncelerine göre çok da az oranlara indirgenmiş ve bellek sızıntısı hatalarının tedavisi daha kolay hale gelmiştir. Az önce de söylediğim gibi Java pointer kavramını kabul etmez ve herşeye nesne gözü ile bakar. GC ise bu nesnelerin aktif kullanımın bellek üzerindeki etkisi ile ilgilenir. Program çalıştığı sürece otomatik olarak bu işlemler gerçekleştirilebileceği gibi aşağıdaki biçimde manuel olarak da tetiklenebilmektedir.
1.
Runtime.getRuntime().gc();  
2.
//veya System.gc();

No comments:

Post a Comment