Merhaba 
Bugün sizlere bellek sızınısını ve nasıl giderildiğini anlatmaya çalışacağım.
Makalemiz 3 ana maddeden oluşuyor;
Bellek sızıntısı, yazdığımız yazılım belleği kullandıktan sonra işletim sistemine geri vermediği durumlarda oluşur. Bellek sızıntısı başka bellek sorunlarına benzer belirtiler yaratır. Bu nedenle bellek kullanımının artışı ile ilgili her sorunun kaynağı bellek sızıntısı olmayabilir.
Bellek sızıntısı, sistem içinde yer alan fiziksel belleğin zaman içerisinde dolmasına neden olur. Fiziksel bellek dolmaya başladıkça sistem sanal belleğe yük bindirmeye başlar. En sonunda hiç bellek kalmayınca sistem doğal olarak çöker.
Bellek sızıntısı zararları nelerdir?
Bellek sızıntısı düzeltilmezse program çalıştığı sürece boyunca belleğin tamamını kullanasaya kadar çalışmaya devam eder. Bu süre içinde bilgisayar yavaşlayabilir, hatta çökebilir. Küçük ölçekli programlarda pek fark edilmez bu durum. Özellike oyunlarda çok fazla meydana gelmektedir.
Sızıntıların çok daha ciddi sorunlar yarattığı bazı durumlar:
Bellek sızıntısı, özellikle kendi çöp toplayıcısı olmayan diller için çok kritik bir durumdur. C++/C gibi dillerde bellek sızıntısı olmaması hayati önem taşır. Ancak C# gibi, kendi çöp toplayıcısı olan bir dil için o kadar hayati öneme sahip değildir. Çünkü, C# gibi diller zamanla programın oluşturduğu belleği boşaltır.
Burada gördüğünüz üzere 64 boyutlu bir Int dizi büyüklüğünde bellek tahsis ettik. Eğer bu alan boş olursa Integer değerinin maksimum değerine kadar (2147483647) değer alabilir. Bu da doğal olarak bellek sızıntısına neden olabilir.
O yüzden değişkenlerin limitlerini belirlemeniz lazım. Bu çok küçük bir örnek, ancak önemli bir örnek.
Şimdi ise C#'ın çöp toplayıcısı olmasına rağmen bellek boşlatma nasıl yapılır ona bakalım.
C# dilinde bellekten veriyi atmak için Dispose() metodu kullanılır. Bu metot, belleği boşlatmak yerine direkt bellekten atar. Dikkat edin, boşlatma ile atma aynı şey değildir. Bir işlem bittiği zaman bellekte durmaya devam eder, Dispose() metodu bellekten direkt atar ve boşaltır.
Dispose() metodu hakkında detaylı bilgi almak için diğer rehberime bakabilirsiniz;
www.technopat.net
Şimdi gerçek bir bellek taşması olan örnek üzerinden devam edelim.
Küçük bir Form oluşturdum. Butona basınca Picturebox'a istediğim resimi ekleyecek ve Label üzerinde resim çözünürlüğünü gösterecek.
Buton kodlarımız;
Program çalıştı. Gördüğünüz üzere 4K bir duvar kağıdı bu. Şimdi bellek kullanımına bakalım;
Gördüğünüz üzere 100 MB RAM kullanıyor. Bakın, sadece 1 görsel açtık diye böyle oldu.
Şimdi ise düşük bellek kullanımı ve bellek sızıntısı olmayan halini yazalım.
Gördüğünüz üzere %70 daha az bellek kullanıyor. Bu şekilde bellek sızıntısını giderebilirsiniz.
Son olarak sonsuz döngü kullanırken çok dikkatli olun. Bellek taşmasının en çok olduğu yerler döngülerdir.
Makalemiz çok uzun olmadı gördüğünüz üzere. Amacımız tamamen bellek taşması olmadan kullanmaktı.
Umarım anlaşılır anlatmışımdır.
Yazılım rehberlerimin devamı gelecek.
İyi çalışmalar, kolay gelsin
İşine yarayacağını düşündüğüm kişiler;
@Enes3078 @Mithat Berhan @246941 @Beroski @Bora Dere @Vavien.
Bugün sizlere bellek sızınısını ve nasıl giderildiğini anlatmaya çalışacağım.
Makalemiz 3 ana maddeden oluşuyor;
- Bellek sızıntısı nedir?
- Bellek sızıntısı zararları nelerdir?
- Bellek sızıntısı nasıl giderildir?
Bellek sızıntısı, yazdığımız yazılım belleği kullandıktan sonra işletim sistemine geri vermediği durumlarda oluşur. Bellek sızıntısı başka bellek sorunlarına benzer belirtiler yaratır. Bu nedenle bellek kullanımının artışı ile ilgili her sorunun kaynağı bellek sızıntısı olmayabilir.
Bellek sızıntısı, sistem içinde yer alan fiziksel belleğin zaman içerisinde dolmasına neden olur. Fiziksel bellek dolmaya başladıkça sistem sanal belleğe yük bindirmeye başlar. En sonunda hiç bellek kalmayınca sistem doğal olarak çöker.
Bellek sızıntısı zararları nelerdir?
Bellek sızıntısı düzeltilmezse program çalıştığı sürece boyunca belleğin tamamını kullanasaya kadar çalışmaya devam eder. Bu süre içinde bilgisayar yavaşlayabilir, hatta çökebilir. Küçük ölçekli programlarda pek fark edilmez bu durum. Özellike oyunlarda çok fazla meydana gelmektedir.
Sızıntıların çok daha ciddi sorunlar yarattığı bazı durumlar:
- Programın uzun süre çalışması ve zaman içinde fazladan bellek tüketmesi.
- Yeni belleğin sıklıkla dağıtılması.
- Sistemin çökmesi.
- Yanıt vermemesi.
- İşletim sisteminin kendi içinde hafıza sızıntısı olması.
- Sızıntının kaynağının bir sistem cihazı sürücüsü olması.
Bellek sızıntısı, özellikle kendi çöp toplayıcısı olmayan diller için çok kritik bir durumdur. C++/C gibi dillerde bellek sızıntısı olmaması hayati önem taşır. Ancak C# gibi, kendi çöp toplayıcısı olan bir dil için o kadar hayati öneme sahip değildir. Çünkü, C# gibi diller zamanla programın oluşturduğu belleği boşaltır.
C++:
deger = new int[64];
Burada gördüğünüz üzere 64 boyutlu bir Int dizi büyüklüğünde bellek tahsis ettik. Eğer bu alan boş olursa Integer değerinin maksimum değerine kadar (2147483647) değer alabilir. Bu da doğal olarak bellek sızıntısına neden olabilir.
O yüzden değişkenlerin limitlerini belirlemeniz lazım. Bu çok küçük bir örnek, ancak önemli bir örnek.
Şimdi ise C#'ın çöp toplayıcısı olmasına rağmen bellek boşlatma nasıl yapılır ona bakalım.
C#:
SaveFileDialog save_engine = new SaveFileDialog{
InitialDirectory = @"C:\Users\" + SystemInformation.UserName + @"\Desktop\",
Title = $"{Application.ProductName} - Please select the location to save",
DefaultExt = "txt",
FileName = $"{Application.ProductName} - System Report",
Filter = "Text Document (*.txt)|*.txt"
};
if (save_engine.ShowDialog() == DialogResult.OK){
MessageBox.Show($"Yazdırma işlemi tamamlandı.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
}
save_engine.Dispose();
C# dilinde bellekten veriyi atmak için Dispose() metodu kullanılır. Bu metot, belleği boşlatmak yerine direkt bellekten atar. Dikkat edin, boşlatma ile atma aynı şey değildir. Bir işlem bittiği zaman bellekte durmaya devam eder, Dispose() metodu bellekten direkt atar ve boşaltır.
Dispose() metodu hakkında detaylı bilgi almak için diğer rehberime bakabilirsiniz;
Rehber: C#'da Dispose metodu nedir ve nasıl kullanılır?
Merhaba. Bugün sizlere C# dilinde yer alan Dispose() metodunun ne işe yaradığını ve nasıl kullanıldığını anlatmaya çalışacağım. Öncelike Dispose() nedir? Dispose(), bir işlemden sonra yapılan işlemi bellekten atmak demek. Yani, siz bir işlemi bitirirken Close() metodu kullandığınız zaman bu...
Şimdi gerçek bir bellek taşması olan örnek üzerinden devam edelim.
Küçük bir Form oluşturdum. Butona basınca Picturebox'a istediğim resimi ekleyecek ve Label üzerinde resim çözünürlüğünü gösterecek.
Buton kodlarımız;
C#:
private void button1_Click(object sender, EventArgs e){
Image get_image = Image.FromFile(@"image_1.jpg");
pictureBox1.BackgroundImage = get_image;
label1.Text = get_image.Width + "x" + get_image.Height;
}
Program çalıştı. Gördüğünüz üzere 4K bir duvar kağıdı bu. Şimdi bellek kullanımına bakalım;
Gördüğünüz üzere 100 MB RAM kullanıyor. Bakın, sadece 1 görsel açtık diye böyle oldu.
Şimdi ise düşük bellek kullanımı ve bellek sızıntısı olmayan halini yazalım.
C#:
private void button1_Click(object sender, EventArgs e){
using (var wallpaper_res = new FileStream("image_1.jpg", FileMode.Open, FileAccess.Read, FileShare.Read)){
using (var wallpaper_res_x64 = Image.FromStream(wallpaper_res, false, false)){
pictureBox1.BackgroundImage = Image.FromFile("image_1.jpg", false);
label1.Text = wallpaper_res_x64.Width + "x" + wallpaper_res_x64.Height;
}
}
}
Gördüğünüz üzere %70 daha az bellek kullanıyor. Bu şekilde bellek sızıntısını giderebilirsiniz.
Son olarak sonsuz döngü kullanırken çok dikkatli olun. Bellek taşmasının en çok olduğu yerler döngülerdir.
Makalemiz çok uzun olmadı gördüğünüz üzere. Amacımız tamamen bellek taşması olmadan kullanmaktı.
Umarım anlaşılır anlatmışımdır.
Yazılım rehberlerimin devamı gelecek.
İyi çalışmalar, kolay gelsin
İşine yarayacağını düşündüğüm kişiler;
@Enes3078 @Mithat Berhan @246941 @Beroski @Bora Dere @Vavien.
Son düzenleyen: Moderatör: