Özet - Bellek ve GC
IDisposable, using ve GC'yi birleştirerek bir kaynak havuzu yazarsın.
Özet - Bellek ve GC
Bu grupta GC'nin nesillerini (Gen 0/1/2), IDisposable ile kaynak yönetimini, using deyimini, GC.Collect'i ve LOH'yu öğrendin.
Bu kavramları bir araya getirerek yönetilen ve yönetilmeyen kaynakları güvenle kullanan kod yazabilirsin. Şimdi küçük bir kaynak havuzu ve toplama denetimi uygulayalım.
Uygulama Pool sınıfına Dispose ekle
Pool sınıfını : IDisposable ile tanımla. public void Dispose() gövdesinde Console.WriteLine("Havuz kapatıldı"); yaz. Main'de using var p = new Pool(); kullan.
Örnek çözümü göster
IDisposable { public void Dispose() { Console.WriteLine("Havuz kapatıldı"); } } yaz. Main'de using var p = new Pool();
Örnek çözüm:
using System;
class Pool : IDisposable
{
public void Dispose()
{
Console.WriteLine("Havuz kapatıldı");
}
}
class Program
{
static void Main()
{
using var p = new Pool();
}
}
Finalizer ve dispose birlikte
Unutma: using yalnızca IDisposable ise çalışır. Sınıfın finalizer'ı varsa ve dispose edildiyse, GC.SuppressFinalize(this) ile finalizer'ı iptal etmek performansı artırır.
Doğru tasarlanmış bir sınıf Dispose'u çağırmayı unutmuş olsa bile finalizer sayesinde kaynağı geri kazanır. Bu güvenlik ağıdır; yine de elle Dispose çağırmak her zaman tercih edilir.
Uygulama LOH dizisi ve toplama
Main'de byte[] buf = new byte[100000]; ile LOH dizisi oluştur. Console.WriteLine("LOH ayrıldı"); yaz. Sonra GC.Collect(); çağır, en son Console.WriteLine("Toplandı"); yaz.
Örnek çözümü göster
byte[] buf = new byte[100000]; Console.WriteLine("LOH ayrıldı"); GC.Collect(); Console.WriteLine("Toplandı"); yaz.
Örnek çözüm:
using System;
class Program
{
static void Main()
{
byte[] buf = new byte[100000];
Console.WriteLine("LOH ayrıldı");
GC.Collect();
Console.WriteLine("Toplandı");
}
}
Kendini test et
-
Aşağıdakilerden hangisi using deyiminin avantajıdır?
- Blok bitince otomatik Dispose
- GC'yi hızlandırır
- Belleği yeniden boyutlandırır
- Thread oluşturur
Cevabı göster
Blok bitince otomatik Dispose — Doğru. using blok sonunda Dispose'u çağırır.
-
Kavramları eşleştir
- IDisposable
- Dispose() metodu
- using
- Otomatik Dispose
- GC.Collect()
- Toplamayı zorla
- LOH
- ~85 KB+ nesneler