Rehber Bellek sızıntısı nedir ve nasıl giderilir?

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ı nedir?
  • Bellek sızıntısı zararları nelerdir?
  • Bellek sızıntısı nasıl giderildir?
Bellek sızıntısı nedir?

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ı nasıl giderilir?

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;

Ş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.

1679311847818.png


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;
}

1679312289916.png


Program çalıştı. Gördüğünüz üzere 4K bir duvar kağıdı bu. Şimdi bellek kullanımına bakalım;

1679312329784.png


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;
        }
    }
}

1679312539864.png


1679312546668.png


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 @MisakiTaro @Beroski @Bora Dere @Vavien.
 
Son düzenleyen: Moderatör:
Elinize sağlık.

Niye böyle renkli renkli yazıyorsunuz?
2/3 olması gerekmiyor mu? Türkiye şartlarında %70'i tercih ederim. Halkımızın pay ve payda ile pek arası yok.

Deneyimlemek isteyenler Thronebreaker: The Witcher Tales oynayabilir. Bir anda işlemcinizin ısınması sonucu fanlarınızın bağırmaya başlaması ile bir sorun olduğunu fark ediyorsunuz. Gariban işlemci yer ayırıp durmaya çalışıyor, sanal belleğe bir şeyler atıp daha fazla vermeye çalışıyor. Başka işlere vakit/kaynak kalmadığı için görev yöneticisini açıp sorunun oyundan kaynaklandığını tespit edip oyunu kapatmak bile uzun sürüyor.
 
Hocam güzel bir anlatım olmuş geçen günlerde başıma gelen olayı anlatayım bu olay bellek sızıntısı mıdır? Geçen gün laptopta oyun vs oynadıktan sonra görev yöneticisne baktığımda PC boşta iken işlemler de güç çeken uygulama olmadığı halde 11GB RAM kullanıyordu res attıktan sonra düzeldi. Bu durumda bellek sızıntısı mıdır?
 
Güzel rehber olmuş.
Python ile veriyi işleyip ekran kartına yollarken çok çekmiştim bu illetten.

Verileri diskten okurken ilk kopya, işledikten sonra 2. kopya ve ekran kartına gönderirken 3. kopya oluşuyordu.
8 GB veri için 24 GB RAM kullanımına sebep oluyordu bu durum.
 
Güzel rehber olmuş.
Python ile veriyi işleyip ekran kartına yollarken çok çekmiştim bu illetten.

Verileri diskten okurken ilk kopya, işledikten sonra 2. kopya ve ekran kartına gönderirken 3. kopya oluşuyordu.
8 GB veri için 24 GB RAM kullanımına sebep oluyordu bu durum.

Bir işlem yapmak için farklı yöntemler var hocam. İnternette hep en kolaylarını yazıp koyuyorlar. Sonra bellek kullanımı uçuyor. Rehber üzerinde gördüğünüz üzere bir işlemin farklı yöntemleri ile minimum bellek kullanımına ulaşmak mümkündür. Bu tamamen deneyim ve tecrübe işi.

Teşekkürler hocam.
 
Hocam cahil sanmayın ama bir sorum olacak.
Formları hangi uygulamadan yapıyorsunuz ?
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ı nedir?
  • Bellek sızıntısı zararları nelerdir?
  • Bellek sızıntısı nasıl giderildir?
Bellek sızıntısı nedir?

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ı nasıl giderilir?

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;

Ş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.

Eki Görüntüle 1708407

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;
}

Eki Görüntüle 1708416

Program çalıştı. Gördüğünüz üzere 4K bir duvar kağıdı bu. Şimdi bellek kullanımına bakalım;

Eki Görüntüle 1708417

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;
        }
    }
}

Eki Görüntüle 1708418

Eki Görüntüle 1708419

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 @MisakiTaro @Beroski @Bora Dere @Vavien.
 

Geri
Yukarı