Garbage Collector: Bellek Sızıntısı Tespiti¶
Bellek sızıntıları, bir uygulamanın gereğinden fazla bellek tüketmesine ve zamanla performans düşüşüne neden olabilir. .NET’in Garbage Collector (GC) mekanizması genellikle bellek yönetimini otomatik olarak yapar, ancak yanlış referans yönetimi veya karmaşık nesne ilişkileri bellek sızıntılarına yol açabilir.
1. Bellek Sızıntısı Nedir?¶
Bellek sızıntısı, artık kullanılmayan ancak Garbage Collector tarafından serbest bırakılmayan nesnelerin bellek tüketmeye devam etmesi durumudur. Bu, genellikle aşağıdaki nedenlerden kaynaklanır:
- Yanlış Referans Yönetimi: Gereksiz referansların tutulması.
- Olay (Event) Abonelikleri:
event
aboneliklerinin iptal edilmemesi. - Statik Nesneler: Statik alanlarda gereksiz veri tutulması.
2. Bellek Sızıntısı Nasıl Tespit Edilir?¶
.NET uygulamalarında bellek sızıntılarını tespit etmek için şu araçları kullanabilirsiniz:
Visual Studio Diagnostic Tools¶
- Memory Usage: Uygulamanın bellek kullanımını izler.
- Heap Snapshots: Anlık bellek durumlarını karşılaştırır.
.NET CLI Tools¶
- dotnet-dump: Bellek dökümleri oluşturur ve analiz eder.
- dotnet-counters: Gerçek zamanlı bellek ölçümleri sağlar.
dotnet-dump collect --process-id <pid>
dotnet-counters monitor --counters Microsoft-Windows-DotNETRuntime:GC/Heap
3. Bellek Sızıntısı Nedenleri ve Çözümleri¶
Yanlış Referans Yönetimi¶
❌ Yanlış Kullanım: Gereksiz referansları temizlememek.
static List<byte[]> cache = new();
void AddToCache()
{
var data = new byte[1024 * 1024];
cache.Add(data); // Referans bırakılmıyor
}
✅ İdeal Kullanım: Referansları zamanında serbest bırakmak.
static List<byte[]> cache = new();
void ClearCache()
{
cache.Clear(); // Referanslar serbest bırakılır
}
Event Aboneliklerini Yönetmemek¶
❌ Yanlış Kullanım: Olaylara abone olduktan sonra iptal etmemek.
button.Click += OnButtonClick; // Abonelik iptal edilmez
✅ İdeal Kullanım: Olay aboneliklerini iptal edin.
button.Click -= OnButtonClick; // Abonelik iptal edilir
Statik Alanlarda Veri Tutmak¶
❌ Yanlış Kullanım: Statik alanlarda büyük nesneleri gereksiz tutmak.
static List<int> staticData = new() { 1, 2, 3 };
✅ İdeal Kullanım: Statik alanları dikkatli yönetin.
static WeakReference<List<int>> staticData = new(new List<int> { 1, 2, 3 });
4. Garbage Collector Diagnostik Modu¶
.NET 9 ile gelen diagnostik araçlar, GC’nin bellek yönetimini analiz etmeyi kolaylaştırır.
<configuration>
<runtime>
<GCHeapHardLimitPercent value="80" />
</runtime>
</configuration>
5. Profiling ve İzleme¶
- JetBrains dotMemory: Derinlemesine bellek analizi.
- Redgate ANTS Memory Profiler: Hafıza sızıntılarını tespit etmek için kullanılır.