Yazılımda performans ve bellek yönetiminin önemini biliyoruz. Küçük çaplı projelerde .Net CLR (Common Language RunTime) sayesinde kodları çalıştırmak
ve bellek yönetimini otomatik olarak yapma görevini üstlensede büyük çaplı, verilerin yoğun aktığı bir projede bellek yönetimini mümkün olduğu kadar elimizde tutmamız gerekir. CLR de bu görevi GC (Garbage Collector) mekanızması sayesinde yerine getirmektedir.
Bilindiği gibi kod tarafında oluşturulan referans tipler için bellekte heap bölgesinde alan tahsis edilir ve işi bittikden sonra bellekten atılırlar ama bellekten atılma süreleri belirsizdir.
Belirsiz dedik çünkü GC nin ne zaman çalışacağı belli değildir. (Kendi içinde mutlaka bir mekanizmaya bağlıdır.)
Direk şu fikir akla gelebilir ozaman bizde GC yi görev başına çagırırız! Evet bu da bir yöntem ama sadece gerçekten gerektiğinde kullanılması gerekir. Çünkü sık sık GC kullanmak performans kaybına neden olur.
Ayrıca oluşturulan nesnelere null değeri atamak o nesneyi bellekten atmaz sadece üzeri kapatılarak erişilmez hale getirir ama arka tarafta bellek alanında var olmaya devam eder.
Ozaman ne yapılmalı ?
IDispose arayüzünden implemente edilmiş Dispose() metodu kullanmalı.
Kullandığımız bir çok nesne Dispose() metoduna sahiptir ve tamamıda IDispose interface inde kalıtım yoluyla geçmiştir.
İsterseniz şimdi kısa bi örnek ile ilerleyelim.
SqlConnection sqlCon = null;
SqlDataAdapter adp = null;
try
{
sqlCon = new SqlConnection("Server=.;Database=AdventureWorks;Uid=sa;Pwd=1234");
adp = new SqlDataAdapter("Select * From Production.Product", sqlCon);
adp.Fill(dt);
}
catch (Exception ex)
{
throw new Exception ("hata", ex);
}
finally
{
sqlCon.Close();
adp.Dispose();
sqlCon.Dispose();
}
Görüldüğü gibi finally blogu her durumda çalışağı için SqlDataAdapter ve SqlConnection nesneleri Dispose işlemine tabi tutulmuşlardır.
Buraya kadar anladık ama using bunun neresinde diyebilir. Şimdi sıra bunun cevabını vermeye geldi.
using anahtarı uyğuladıgınız sınıflarda otomatik olarak dispose çalıştırır.
Yani bunun anlamı finaly blogunda ayrıca adp.Dispose(); şeklinde metoduğu çagırmanıza gerek kalmaz using bizim için bunu yapar demektir.
usin ifadesi nesnenin yaşam sürecini belirtir.
using(SqlCommand cmd=new SqlCommand("Select * From Production.Product", sqlCon))
{
// işlenen komutlar
// SqlCommand yaşam alanı
}
Örnekte bakacak olursak SqlCommand yaşam alanı { } arasında son bulacaktır. Otomatik olarak Dipose() uygulanmış olur.
Çok kullanıcılı bir programda bunun ne kadar önemli oldugunu tahmin edersiniz.
Sizlerde geliştirdiğiniz sınıflara aşagıda ki örnegi uygulayarak usin ifadesiyle otomatik dispose a tabi tutabilirsiniz.
class MyClass:IDisposable
{
public void Dispose()
{
//Dispose kodlarınız...
}
}
Umarım faydalı olmuştur.
ve bellek yönetimini otomatik olarak yapma görevini üstlensede büyük çaplı, verilerin yoğun aktığı bir projede bellek yönetimini mümkün olduğu kadar elimizde tutmamız gerekir. CLR de bu görevi GC (Garbage Collector) mekanızması sayesinde yerine getirmektedir.
Bilindiği gibi kod tarafında oluşturulan referans tipler için bellekte heap bölgesinde alan tahsis edilir ve işi bittikden sonra bellekten atılırlar ama bellekten atılma süreleri belirsizdir.
Belirsiz dedik çünkü GC nin ne zaman çalışacağı belli değildir. (Kendi içinde mutlaka bir mekanizmaya bağlıdır.)
Direk şu fikir akla gelebilir ozaman bizde GC yi görev başına çagırırız! Evet bu da bir yöntem ama sadece gerçekten gerektiğinde kullanılması gerekir. Çünkü sık sık GC kullanmak performans kaybına neden olur.
Ayrıca oluşturulan nesnelere null değeri atamak o nesneyi bellekten atmaz sadece üzeri kapatılarak erişilmez hale getirir ama arka tarafta bellek alanında var olmaya devam eder.
Ozaman ne yapılmalı ?
IDispose arayüzünden implemente edilmiş Dispose() metodu kullanmalı.
Kullandığımız bir çok nesne Dispose() metoduna sahiptir ve tamamıda IDispose interface inde kalıtım yoluyla geçmiştir.
İsterseniz şimdi kısa bi örnek ile ilerleyelim.
SqlConnection sqlCon = null;
SqlDataAdapter adp = null;
try
{
sqlCon = new SqlConnection("Server=.;Database=AdventureWorks;Uid=sa;Pwd=1234");
adp = new SqlDataAdapter("Select * From Production.Product", sqlCon);
adp.Fill(dt);
}
catch (Exception ex)
{
throw new Exception ("hata", ex);
}
finally
{
sqlCon.Close();
adp.Dispose();
sqlCon.Dispose();
}
Görüldüğü gibi finally blogu her durumda çalışağı için SqlDataAdapter ve SqlConnection nesneleri Dispose işlemine tabi tutulmuşlardır.
Buraya kadar anladık ama using bunun neresinde diyebilir. Şimdi sıra bunun cevabını vermeye geldi.
using anahtarı uyğuladıgınız sınıflarda otomatik olarak dispose çalıştırır.
Yani bunun anlamı finaly blogunda ayrıca adp.Dispose(); şeklinde metoduğu çagırmanıza gerek kalmaz using bizim için bunu yapar demektir.
usin ifadesi nesnenin yaşam sürecini belirtir.
using(SqlCommand cmd=new SqlCommand("Select * From Production.Product", sqlCon))
{
// işlenen komutlar
// SqlCommand yaşam alanı
}
Örnekte bakacak olursak SqlCommand yaşam alanı { } arasında son bulacaktır. Otomatik olarak Dipose() uygulanmış olur.
Çok kullanıcılı bir programda bunun ne kadar önemli oldugunu tahmin edersiniz.
Sizlerde geliştirdiğiniz sınıflara aşagıda ki örnegi uygulayarak usin ifadesiyle otomatik dispose a tabi tutabilirsiniz.
class MyClass:IDisposable
{
public void Dispose()
{
//Dispose kodlarınız...
}
}
Umarım faydalı olmuştur.
Hiç yorum yok:
Yorum Gönder