Garbage Collector: Java'da Bellek Yönetimi Nasıl Çalışır?

crazy_coder

Moderatör
Katılım
20 Şub 2026
Mesajlar
204
Tepkime puanı
0
Puanları
16
Garbage Collector: Otomatik Bellek Yönetimi



1. Java Bellek Yapısı: Heap ve Stack​


Bellek yönetimine girmeden önce, verilerin nerede tutulduğunu bilmek gerekir:

Stack: Metot çağrıları, yerel değişkenler ve referanslar burada tutulur. Çok hızlıdır ancak ömrü kısadır.

Heap: Nesnelerin (Object) asıl verilerinin tutulduğu devasa alandır. Garbage Collector sadece bu alanla ilgilenir.

2. Nesnelerin Ömür Çizelgesi: Generational Strategy​


JVM (Java Sanal Makinesi), nesnelerin çoğunun "çok kısa süreli yaşadığı" gerçeğine dayanarak Heap alanını bölümlere ayırır. Bu strateji temizlik işlemini hızlandırır.


  • []Young Generation (Genç Nesil): Yeni oluşturulan tüm nesneler buradaki Eden alanına gider. Kısa ömürlü nesneler burada hızla temizlenir (Minor GC).
    []Old Generation (Yaşlı Nesil): Genç nesil alanında yapılan birkaç temizlik turundan (Survivor alanları arası geçiş) sonra hala hayatta kalan nesneler buraya aktarılır. Burada yapılan temizlik daha ağır ve nadirdir (Major/Full GC).

3. Bir Nesnenin "Çöp" Olduğu Nasıl Anlaşılır?​


Bir nesneye artık hiçbir yerden ulaşılamıyorsa (referansı kalmadıysa), o nesne çöp olarak işaretlenir.

Java:
Kullanici k1 = new Kullanici(); // Heap'te bir nesne oluştu
k1 = null; // Nesne artık "erişilemez" (unreachable) durumda.
// Bir sonraki GC turunda silinecek.

Mark-and-Sweep Algoritması​

Garbage Collector genellikle şu iki adımı izler:

Mark (İşaretle): Hala kullanılan (erişilebilen) nesneler belirlenir.

Sweep (Süpür): İşaretlenmemiş tüm nesneler bellekten silinir.

4. Stop-The-World (Dünyayı Durdur) Olayı​


Garbage Collector temizlik yaparken, nesnelerin yerini değiştirebileceği veya referansları güncelleyeceği için uygulamanın tüm thread'lerini (iş parçacıklarını) çok kısa bir süreliğine durdurur. Buna Stop-The-World denir. Modern GC algoritmaları (G1, ZGC gibi) bu duraksama süresini milisaniyelerin altına indirmeyi hedefler.

5. Manuel Müdahale Gerekli mi?​


Java'da System.gc() komutu ile çöp toplayıcıyı çağırma şansınız vardır. Ancak bu komut bir emir değil, sadece bir tavsiyedir. JVM, o an uygun görmezse temizlik yapmayabilir. Genellikle GC'ye manuel müdahale etmek kötü bir pratiktir; JVM bu süreci bizden daha iyi yönetir.

Faydalı Özet Tablosu​


ÖzellikAçıklama
AvantajBellek sızıntılarını (Memory Leak) büyük oranda önler, geliştiriciyi manuel free() zahmetinden kurtarır.
DezavantajTemizlik anındaki duraksamalar (pause) bazen yüksek performanslı sistemlerde gecikmeye (latency) neden olabilir.
Modern GC'lerG1 GC (Java 9+ varsayılan), ZGC (çok düşük gecikme süreli) ve Shenandoah.



Sonuç

Java'nın belleği bu kadar akıllıca yönetmesi, dilin bu kadar popüler ve güvenli olmasının ana nedenlerinden biridir. Ancak yine de dikkatli olmalısınız; eğer bir nesnenin referansını bir List veya Map içinde "unutursanız", GC o nesnenin hala kullanıldığını sanarak silmez. Bu durum, zamanla uygulamanızın şişmesine (Memory Leak) yol açar.
 
Geri
Üst