C# में OutOfMemoryException पकड़ना
OutOfMemoryException तब थ्रो होता है जब CLR आवश्यक मेमोरी आवंटित नहीं कर पाता। यह System.SystemException से विरासत में मिला है।
सामान्य कारण
- बहुत बड़े ऑब्जेक्ट्स आवंटित करना ( > 2GB सिंगल ऑब्जेक्ट लिमिट)।
- मेमोरी लीक (इवेंट हैंडलर्स अनसब्सक्राइब न करना, स्टैटिक रेफरेंसेज)।
- 32-बिट प्रोसेस में 2GB वर्चुअल एड्रेस स्पेस लिमिट।
- बड़े ऑब्जेक्ट्स के लिए
StringBuilderकी कैपेसिटी गलत सेट करना।
उदाहरण: StringBuilder कैपेसिटी इश्यू
using System;
using System.Text;
class Program {
static void Main() {
try {
string name = "Tom";
string subject = "Maths";
// गलत: कैपेसिटी = प्रारंभिक लंबाई (3), ऑटो-ग्रोथ नहीं
StringBuilder sb = new StringBuilder(name.Length, name.Length);
sb.Append(name); // "Tom" - ठीक है
sb.Insert(2, subject); // "Tom" में इंडेक्स 2 पर "Maths" इन्सर्ट -> कैपेसिटी ओवरफ्लो
Console.WriteLine(sb.ToString());
}
catch (OutOfMemoryException ex) {
Console.WriteLine("Error: Out of memory");
Console.WriteLine(ex.Message);
}
}
}
आउटपुट
Error: Out of memory Out of memory
सही StringBuilder उपयोग
// सही: डिफ़ॉल्ट कंस्ट्रक्टर (ऑटो-ग्रोथ) या पर्याप्त कैपेसिटी StringBuilder sb = new StringBuilder(); // डिफ़ॉल्ट 16, ऑटो-ग्रोथ StringBuilder sb2 = new StringBuilder(100); // प्रारंभिक कैपेसिटी 100 StringBuilder sb3 = new StringBuilder(name + subject); // स्ट्रिंग से सीधे
OutOfMemoryException से बचाव
- 64-बिट प्रोसेस चलाएं: प्रोजेक्ट प्रॉपर्टीज → Build → "Prefer 32-bit" अनचेक करें।
- स्ट्रीमिंग/चंकिंग: बड़ी फाइल्स एक साथ लोड न करें;
Stream,yield returnउपयोग करें। - मेमोरी प्रोफाइलिंग: dotMemory, VS Diagnostic Tools,
GC.GetTotalMemory()। - बड़े ऑब्जेक्ट्स के लिए:
ArrayPool<T>,Memory<T>,Span<T>उपयोग करें। - GC कॉन्फिगरेशन:
gcServer,gcConcurrentसेटिंग्स (ASP.NET Core के लिए)।
कैच करने का नोट
OutOfMemoryException पकड़ना अक्सर देर हो चुकी होती है; प्रोग्राम अस्थिर स्थिति में हो सकता है। रोकथाम (ऊपर) इलाज से बेहतर है।