Garbage Collector: Gen 0, 1, 2, LOH & IDisposable Pattern
.NET runtime'ın hafızayı 3 jenerasyon ve 85KB üzeri dev nesneler olarak temizleme motorudur.
Masanın üstündeki çöp kutusu (Gen 0), her gün boşaltılan oda çöpü (Gen 1) ve haftada bir gelen büyük çöp kamyonudur (Gen 2). 85KB üzeri nesneler ise doğrudan LOH (Büyük Eşya Alanı) olarak kabul edilir.
CLR Garbage Collector nesneleri yaşlarına göre 3 kuşağa ayırır: Gen 0 (yeni kısa ömürlü), Gen 1 (ara kuşak), Gen 2 (uzun ömürlü). 85.000 byte üzeri nesneler Large Object Heap (LOH)'e gider ve sıkıştırılmaz (fragmentation riski). Yönetilmeyen kaynaklar (unmanaged: dosya, socket, db connection) için IDisposable & using zorunludur.
“GC otomatik bellek yönetimi yapar ancak veritabanı bağlantısı, dosya akışı gibi unmanaged kaynakları temizleyemez. Bunun için IDisposable uygulanır ve using bloğuyla Dispose() garantilenir. LOH'a 85KB üzeri nesneler gider; Gen 2 toplamaları pahalı (stop-the-world) olduğundan nesne tahsisini minimize etmek gerekir.”
public class ResourceHolder : IDisposable
{
private FileStream _file;
public void Dispose()
{
_file?.Dispose();
GC.SuppressFinalize(this);
}
}
using bloğu kullanmayıp SqlConnection veya HttpClient nesnelerini kontrolsüzce havada bırakmak.