Merhabalar, C# OutOfMemoryException Nedenleri dersim ile C# eğitim setime ve Exceptions derslerime devam ediyorum. Önceki dersimde C# NullReferenceException – Nedenleri ve Kullanımı konusunda değinmiştik. Bu dersimizde ise çok sık karşılaşmadığımız bir özel durum olan OutOfMemoryException konusuna değineceğim.
C# OutOfMemoryException Nedenleri
Devralma : Object > Exception > SystemException >OutOfMemoryException
OutOfMemoryException, programın çalışmaya devam etmek için yeterli bellek kalmadığı durumlarda ortaya çıkar. Yani bilgisayarın RAM Belleği dolduğunda ortaya çıkan bir özel durumdur. Bu sebeple çok fazla karşımıza çıkan bir özel durum değildir.
OutOfMemoryException oluşmasına neden olan iki ana unsur vardır.
1 – StringBuilder sınıfının StringBuilder.MaxCapacity özelliği tarafından belirlenen maksimum alanı daha fazla genişletmeye çalışıyorsunuz.
2 – Bir işlemi başarılı bir şekilde gerçekleştirmek için yeterli bellek alanı yoktur. Bu durum bir bellek ayrıma gerektiren bir özellik atama veya yöntem çağrısı sebebi ile oluşabilir.
Bu tür bir OutOfMemoryException özel durumu çok zararlı bir durumu ifade eder. Özel durumu işlemek isterseniz, uygulamanızı kapatmak ve sistem olay günlüğüne bir girdi eklemek için Environment.FailFast yöntemini çağıran bir catch
bloğunu kullanmanız gerekmektedir. Aşağıda bu konu üzerinde bir örnek görebilirsiniz.
try { // Beklenmeyen istisnaları işlemek için dış blok. try { string s = "This"; s = s.Insert(2, "is "); // Bir OutOfMemoryException istisnası atın. throw new OutOfMemoryException(); } catch (ArgumentException) { Console.WriteLine("ArgumentException in String.Insert"); } // Program mantığını yürütün. } catch (OutOfMemoryException e) { Console.WriteLine("Terminating application unexpectedly..."); Environment.FailFast(String.Format("Out of Memory: {0}", e.Message)); }
Aşağıdaki örnekte de bir StringBuilder.MacCapacity belirlenen maksimum alanı aşmaya çalışan bir kod bloğu görüyorsunuz. Burada StringBuilder.Insert(Int32, String, Int32) yöntemine kullanılmak istenen çağırma ile oluşturulan OutOfMemoryException özel durumu gösterir.
#region OutOfMemoryException Çıkarma ve Yakalama Örneği private void btn_OutOfMemoryException_Click(object sender, EventArgs e) { StringBuilder sb = new StringBuilder(15, 15); sb.Append("Substring #1 "); try { sb.Insert(0, "Substring #2 ", 1); } catch (OutOfMemoryException ex) { txt_cikti.Text += ex.GetType().Name + ":" + ex.Message; } } #endregion
Bu örnekteki ilk satıra baktığımızda, StringBuilder sınıfını kullanırken Capacity özelliğini 15 olarak belirledik. Ancak yapmak istediğimiz işlem bu alanı aşıtğından OutOfMemoryException özel durumu alıyoruz. Bu özel durumunu şu ifade ile alıyoruz. “OutOfMemoryException:Programın yürütülmesine devam etmek için bellek yeterli değil.”
Bu özel durumun mantığına uygun olarak bir kullanım veremiyorum. Yukarıdaki örneğe bakarak gerekiyorsa önceki derslerimde ya da github projemde gördüğünüz kullanım şekillerine göre bir kullanım yapabilirsiniz. Bu özel durum, diğer özel durumlara göre biraz daha farklı olduğundan çok farklı detayları mevcuttur. Tüm detaylarını bu yazımda veremeyeceğim. Aşağıda en detaylı haline ulaşabileceğiniz bir bağlantı bıraktım.
NOT: Exceptions konusu derslerime şimdilik ara veriyorum. Genel olarak en sık karşılaştığımız Exceptions’ları işlemeye çalıştım. Karşılaştığım diğer Exception’ları karşılaştığım zamanlarda ekleyeceğim.
Bir OutOfMemoryException Exception hatası nedeni ve çözümü için bu yazıya göz atmak isteyebilirsiniz. C# StringBuilder Sınıfı Kullanımı
C# OutOfMemoryException Nedenleri dersimiz de bu kadardı arkadaşlar.
Tüm Exceptions derslerime bağlantıdan ulaşabilirsiniz.
Daha fazla detay için Microsoft.Docs sitesinde bakabilirsiniz.
C Sharp Eğitim Seti eğitimi sayfasına gitmek için tıklayınız.
Derslerime özel olarak hazırladığım Github Projeme buradan ulaşabilirsiniz… Bu dersim Github projemde yerini almıştır. Tüm Exception adı altında eklediğim dersleri Github projeme ekleyeceğim.
Sağlıcakla ve takipte kalın.