.NET'te Garbage Collector nasıl çalışır? Generation'lar, Large Object Heap ve IDisposable ilişkisini açıklayın.

Cevap

.NET GC generational ve compacting bir collector'dır. Managed heap üç nesle ayrılır:

  • Gen 0: yeni nesneler. Çok sık ve çok hızlı toplanır.
  • Gen 1: Gen 0'dan sağ çıkanlar; kısa ve uzun ömürlüler arasında tampon.
  • Gen 2: uzun ömürlü nesneler (cache, singleton). Gen 2 toplaması (full GC) en pahalısıdır.

GC, root'lardan (stack, statik alanlar, GC handle'ları) erişilebilen nesneleri işaretler, erişilemeyenleri siler ve canlıları sıkıştırarak (compact) parçalanmayı önler.

Large Object Heap (LOH)

85.000 byte ve üzeri nesneler (büyük diziler, büyük string'ler) LOH'a gider. LOH mantıksal olarak Gen 2 ile birlikte toplanır ve varsayılan olarak compact edilmez; sık büyük allocation parçalanmaya ve full GC'lere yol açar. Çözüm: ArrayPool<T>.Shared, RecyclableMemoryStream, Span<T> ile buffer yeniden kullanımı.

Workstation ve Server GC

  • ASP.NET Core varsayılan olarak Server GC kullanır: CPU başına heap ve GC thread'i, yüksek throughput.
  • Background GC, Gen 2 toplamasını uygulama çalışırken eşzamanlı yapar.
  • .NET 8+ container'larda bellek kullanımını azaltmak için DATAS (dinamik heap sayısı) sunar; .NET 9'da Server GC için varsayılan oldu.

GC varsa neden IDisposable?

GC yalnızca managed belleği yönetir. Dosya handle'ı, socket, DB bağlantısı gibi unmanaged kaynaklar GC'nin ne zaman çalışacağına bırakılamaz; deterministik olarak serbest bırakılmalıdır.

await using var conn = new NpgsqlConnection(cs);
await conn.OpenAsync();
// blok bitince DisposeAsync çağrılır, bağlantı pool'a döner
  • Finalizer (~MyClass()) yalnızca son çare güvenlik ağıdır: nesne en az bir GC döngüsü daha yaşar, finalizer thread'inde çalışır. Unmanaged kaynak sarmalarken SafeHandle tercih edin.
  • Dispose pattern'de GC.SuppressFinalize(this) ile gereksiz finalization engellenir.

Bellek sızıntıları

GC'li dilde de sızıntı olur: abonelikten çıkılmayan event handler'lar, büyüyen statik koleksiyonlar, captive dependency. dotnet-counters ile GC metriklerini, dotnet-gcdump / dotnet-dump ile heap'i inceleyin.

  1. EF Core'da change tracking nasıl çalışır? AsNoTracking ne zaman kullanılır ve N+1 problemi nasıl önlenir?OrtaC# & .NETBackend
  2. IEnumerable<T> ile IQueryable<T> arasındaki fark nedir? EF Core'da yanlış kullanım ne gibi sorunlara yol açar?KolayC# & .NETBackend
  3. LINQ'te deferred execution nedir? Aşağıdaki kodun çıktısı ne olur?OrtaC# & .NETBackend
  4. async/await kullanırken .Result veya .Wait() çağırmak neden deadlock'a yol açabilir? ConfigureAwait(false) ne işe yarar?ZorC# & .NETBackend
  5. ASP.NET Core DI'da Transient, Scoped ve Singleton lifetime'ları arasındaki fark nedir? Captive dependency nedir?OrtaC# & .NETBackend
  6. ASP.NET Core'da middleware pipeline nasıl çalışır? Use, Run ve Map farkı nedir, sıralama neden önemlidir?OrtaC# & .NETBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle