Garbage collection: kullanılmayan belleğin otomatik olarak geri kazanılması
Sözlük

Garbage collection: kullanılmayan belleğin otomatik olarak geri kazanılması

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 3 dk okuma

Garbage collection nedir, kullanılmayan bellek otomatik olarak nasıl temizlenir? Java örneğiyle çalışma mantığı, duraklamalar ve bellek sızıntısı farkı.

Garbage collection nedir?

Garbage collection (çöp toplama), bir programın artık erişemediği nesnelerin kapladığı belleği çalışma zamanı sisteminin otomatik olarak boşaltmasıdır. Bu işi yapan bileşene çöp toplayıcı (garbage collector) denir. Java, C#, Go, Python ve JavaScript gibi dillerin çalışma ortamlarında bulunur.

Geliştirici bellek ayırmayı nesne oluşturarak yapar, ancak serbest bırakmayı elle yapmaz. Böylece C ve C++ gibi dillerde sık görülen hatalar, yani serbest bırakmayı unutmak ya da bırakılmış belleğe tekrar erişmek, büyük ölçüde ortadan kalkar.

Nasıl çalışır?

Temel fikir, erişilebilirliktir. Çöp toplayıcı, programın doğrudan kullandığı başlangıç noktalarından (yığındaki değişkenler, statik alanlar gibi kökler) başlar ve referansları takip ederek ulaşılabilen tüm nesneleri işaretler. İşaretlenmeyen nesnelere hiçbir yerden ulaşılamaz; bunlar çöptür ve belleği geri alınır. Bu yaklaşıma işaretle ve süpür (mark and sweep) denir.

Birçok çalışma ortamı bunu iyileştirmek için nesneleri yaşa göre ayırır. Çoğu nesne kısa ömürlüdür; bu yüzden yeni nesneler ayrı bir genç bölgede toplanır ve bu bölge sık, hızlı bir biçimde temizlenir. Uzun süre hayatta kalan nesneler yaşlı bölgeye taşınır ve orası daha seyrek temizlenir. Bellek parçalanmasını önlemek için nesneler bazen sıkıştırılarak yeniden dizilir.

Java'dan küçük bir örnek

Örneğin bir Java servisinde her istek için geçici nesneler oluşturulur: istek verisi, dönüşüm nesneleri, cevap nesneleri. İstek bitince bu nesnelere hiçbir referans kalmaz. Çöp toplayıcı bir sonraki genç bölge temizliğinde bunları siler.

Ancak servis, gelen her kullanıcıyı bir statik listeye ekleyip hiç çıkarmıyorsa o listedeki nesnelere hâlâ ulaşılabilir demektir. Çöp toplayıcı bunları silemez. Bellek zamanla dolar ve program sonunda bellek yetersizliği hatasıyla durur. Buna mantıksal bellek sızıntısı denir ve çöp toplama olsa bile yaşanabilir.

Duraklamalar ve performans etkisi

Çöp toplama bedelsiz değildir. Birçok algoritma, bazı aşamalarda uygulamayı kısa süre durdurur (stop the world). Bu duraklamalar uzadığında kullanıcı yavaşlama hisseder. Bu nedenle çöp toplayıcıların tasarımında temel denge, işlem hacmi (throughput) ile gecikme (latency) arasındaki dengedir.

Modern toplayıcılar işin büyük kısmını uygulama çalışırken eşzamanlı yürüterek duraklamaları kısaltmaya çalışır. Hangi toplayıcının uygun olduğu, uygulamanın bellek boyutuna, gecikme duyarlılığına ve işlemci kaynaklarına göre seçilir. Ayar yapmadan önce her zaman ölçüm yapmak gerekir: çöp toplama günlüklerini ve profil verilerini incelemek, tahmine dayalı ayardan çok daha güvenilirdir.

Yakın kavramlarla farkı

Manuel bellek yönetiminde geliştirici ayırdığı belleği kendisi serbest bırakır. Daha hassas denetim sağlar ama hata riski yüksektir. Referans sayımı (reference counting) ise her nesnenin kaç referansı olduğunu sayar ve sıfıra inince serbest bırakır; döngüsel referanslarla başa çıkmakta zorlanabilir. Rust gibi dillerde sahiplik kuralları derleme zamanında belleğin ne zaman serbest kalacağını belirler ve çalışma zamanı toplayıcısı gerekmez.

Bellek sızıntısı ise çöp toplamanın alternatifi değil, onun yakalayamadığı bir sorundur: nesneye gereksiz yere erişilebilir kalması.

Yaygın hatalar ve nasıl önlenir?

  • Statik ya da uzun ömürlü koleksiyonlara nesne biriktirip temizlememek. Önbellek kullanılıyorsa boyut sınırı ve süre sınırı koymak gerekir.
  • Çok sayıda geçici nesne üretmek. Döngü içinde gereksiz nesne oluşturmaktan kaçınmak toplayıcı üzerindeki yükü azaltır.
  • Kapatılmayan kaynaklar. Dosya ve bağlantı gibi kaynaklar çöp toplamayla değil, açıkça kapatılarak yönetilir.
  • Ölçmeden ayar yapmak. Bellek parametrelerini rastgele artırmak sorunu çözmez, bazen duraklamaları uzatır.

Profilleme araçları ve yığın dökümü analizi, hangi nesnelerin bellekte tutulduğunu ve kimin tuttuğunu gösterir.

Mindset programlarında nerede karşınıza çıkar?

Java İleri Seviye: JVM Performans ve Bellek Yönetimi eğitimi, JVM mimarisi ve bellek bölgeleri, çöp toplama algoritmaları, profilleme ve gözlemlenebilirlik, JIT derleme ve kod optimizasyonu, eşzamanlılık ve kilit analizi ile ayar, konteyner ve kapasite planlaması modüllerini içerir.

İlgili Mindset programı

Java İleri Seviye: JVM Performans ve Bellek Yönetimi

Sık sorulanlar

Sık sorulan sorular

Çöp toplama olan dillerde bellek sızıntısı olur mu?

Evet. Çöp toplayıcı yalnızca erişilemeyen nesneleri siler. Bir nesneye yanlışlıkla erişilebilir kalıyorsa, örneğin bir listede unutulmuşsa, silinmez ve bellek zamanla dolar. Bu nedenle uzun ömürlü koleksiyonları ve önbellekleri sınırlandırmak gerekir.

Çöp toplayıcıyı elle tetiklemek gerekir mi?

Genellikle gerekmez ve önerilmez. Çoğu çalışma ortamında bir çağrı yalnızca toplayıcıya ipucu verir; tetiklenmesi garanti edilmez ve zamanlaması tahmin edilemez. Sorunun kökünü, yani bellek kullanım düzenini analiz etmek, elle çağrı yapmaktan çok daha etkili bir çözümdür.

Duraklama uygulamamı yavaşlatıyorsa ne yapmalıyım?

Önce çöp toplama günlüklerini açıp duraklamaların ne kadar sürdüğünü ve ne sıklıkla olduğunu ölçün. Ardından nesne üretimini azaltmayı, bellek boyutunu gözden geçirmeyi veya gecikme odaklı bir toplayıcı seçmeyi değerlendirin. Her değişiklik sonrasında yeniden ölçüm yapın.

Çöp toplayıcı konteynerde farklı mı çalışır?

Mekanizma aynıdır, ancak konteyner bellek ve işlemci sınırları toplayıcının davranışını etkiler. Sınırlar gerçeğe uygun algılanmazsa bellek yanlış boyutlanabilir ya da konteyner bellek yetersizliği nedeniyle sonlandırılabilir. Bu yüzden konteyner ortamında ayarlar ve izleme ayrıca ele alınmalıdır.

Garbage Collection (Çöp Toplama) Nedir?