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
| Özellik | Açıklama |
|---|---|
| Avantaj | Bellek sızıntılarını (Memory Leak) büyük oranda önler, geliştiriciyi manuel free() zahmetinden kurtarır. |
| Dezavantaj | Temizlik anındaki duraksamalar (pause) bazen yüksek performanslı sistemlerde gecikmeye (latency) neden olabilir. |
| Modern GC'ler | G1 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.