crazy_coder
Moderatör
- Katılım
- 20 Şub 2026
- Mesajlar
- 204
- Tepkime puanı
- 0
- Puanları
- 16
Garbage Collector (GC): .NET'te Otomatik Bellek Yönetimi
Garbage Collector, uygulamanızın kullandığı belleği (RAM) izleyen ve artık ihtiyaç duyulmayan nesneleri tespit edip temizleyen otomatik bir sistemdir. Bu sayede "Memory Leak" (bellek sızıntısı) riskini minimuma indirir.
1. Stack ve Heap Kavramı
Bellek yönetimi iki ana bölge üzerinden döner:
[]Stack (Yığın): Değer tipi değişkenlerin (int, bool, struct) ve metot adreslerinin tutulduğu yerdir. Veriler "LIFO" (Son giren ilk çıkar) mantığıyla çok hızlı temizlenir.
[]Heap (Öbek): Referans tipi nesnelerin (class, string, array) tutulduğu yerdir. GC'nin asıl çalışma alanı burasıdır. Nesneler burada yaşar ve temizlenmeleri için GC'nin gelmesi beklenir.
2. Nesne Nesilleri (Generations)
GC, performansı artırmak için nesneleri yaşlarına göre üç gruba ayırır. Bu yaklaşıma "Episodic Hypothesis" denir (yeni nesneler genellikle kısa ömürlüdür).
[]Generation 0 (Gen 0): En yeni nesneler buradadır. En sık temizlik burada yapılır. Eğer bir nesne Gen 0 temizliğinden sağ çıkarsa bir üst seviyeye terfi eder.
[]Generation 1 (Gen 1): Kısa ile uzun ömürlü nesneler arasındaki geçiş bölgesidir.- Generation 2 (Gen 2): Uzun ömürlü (statik veriler, cache vb.) nesnelerin bulunduğu yerdir. Buradaki temizlik (Full GC) maliyetlidir ve daha seyrek yapılır.
3. GC Nasıl Karar Verir? (Mark & Sweep)
GC rastgele çalışmaz; genellikle bellek dolduğunda veya sistemde kaynak sıkıntısı olduğunda devreye girer. Süreç üç aşamadan oluşur:
[]Mark (İşaretleme): GC, uygulamanın "Root" (Kök) noktalarından başlar ve ulaşabildiği tüm nesneleri "yaşıyor" olarak işaretler.
[]Relocate (Yeniden Konumlandırma): Hayatta kalan nesnelerin adreslerini günceller.- Compact (Sıkıştırma): Ölü nesnelerin yerini boşaltır ve bellekteki parçalanmayı (fragmentation) önlemek için canlı nesneleri yan yana dizer.
4. Unmanaged Code ve IDisposable
GC, sadece .NET içindeki (Managed) nesneleri yönetebilir. Veritabanı bağlantıları, dosya akışları (Stream) veya Network soketleri gibi Unmanaged kaynakları otomatik temizleyemez.
Çözüm: IDisposable arayüzü ve using bloğu.
C#:
// using bloğu bittiğinde Dispose() otomatik çağrılır ve kaynak serbest bırakılır
using (var stream = new FileStream("data.txt", FileMode.Open))
{
// İşlemler...
}
5. GC Performansını Artıran İpuçları
| Yapılmalı | Kaçınılmalı |
|---|---|
| IDisposable kullanan nesneleri using ile yönetin. | Gerekmedikçe GC.Collect() metodunu manuel çağırmayın. |
| Kısa ömürlü nesneleri Gen 0'da tutun. | Büyük nesneleri (Large Object Heap - LOH) gereksiz yere oluşturmayın. |
| Statik (static) değişkenleri dikkatli kullanın. | Gereksiz "String Concatenation" yerine StringBuilder kullanın. |
Sonuç
Garbage Collector, C# geliştiricileri için muazzam bir lükstür ancak nasıl çalıştığını bilmek, özellikle yüksek performanslı ve ölçeklenebilir uygulamalar yazarken kritik önem taşır. Belleğin nasıl yönetildiğini anladığınızda, "Stop-the-world" (GC'nin tüm uygulamayı durdurduğu an) sürelerini kısaltacak daha optimize kodlar yazabilirsiniz.