Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C#

C# में OutOfMemoryException पकड़ें

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 से बचाव

  1. 64-बिट प्रोसेस चलाएं: प्रोजेक्ट प्रॉपर्टीज → Build → "Prefer 32-bit" अनचेक करें।
  2. स्ट्रीमिंग/चंकिंग: बड़ी फाइल्स एक साथ लोड न करें; Stream, yield return उपयोग करें।
  3. मेमोरी प्रोफाइलिंग: dotMemory, VS Diagnostic Tools, GC.GetTotalMemory()।
  4. बड़े ऑब्जेक्ट्स के लिए: ArrayPool<T>, Memory<T>, Span<T> उपयोग करें।
  5. GC कॉन्फिगरेशन: gcServer, gcConcurrent सेटिंग्स (ASP.NET Core के लिए)।

कैच करने का नोट

OutOfMemoryException पकड़ना अक्सर देर हो चुकी होती है; प्रोग्राम अस्थिर स्थिति में हो सकता है। रोकथाम (ऊपर) इलाज से बेहतर है।

  1. Windows 10 में ग्रे आउट सिस्टम रिस्टोर ठीक करें: चरण-दर-चरण गाइड Windows 10 में ग्रे आउट सिस्टम रिस्टोर ठीक करें: चरण-दर-चरण गाइड

    सिस्टम रिस्टोर Windows की एक अंतर्निहित सुविधा है जो पहले से सेव किए गए रिस्टोर पॉइंट्स से सिस्टम सेटिंग्स को रिस्टोर करने की अनुमति देती है। इस सुविधा ने हमें कई बार बचाया है, लेकिन Windows 10 में अपडेट करने के बाद हममें से कुछ को सिस्टम रिस्टोर के साथ एक समस्या का सामना करना पड़ता है यानी सिस्टम र

  1. Kmode एक्सेप्शन एरर समझाया गया और विंडोज 10 के लिए स्टेप-बाय-स्टेप फिक्स Kmode एक्सेप्शन एरर समझाया गया और विंडोज 10 के लिए स्टेप-बाय-स्टेप फिक्स

    बग चेक वैल्यू 0x0000001E के साथ Kmode_Exception_Not_Handled एरर इंगित करता है कि एक कर्नेल-मोड प्रोग्राम ने एक एक्सेप्शन उत्पन्न किया जिसे एरर हैंडलर ने मैच नहीं किया। एरर का मैकेनिक्स दर्दनाक है। सरल शब्दों में यह तब होता है, जब ऐप्स या प्रोग्राम एक-दूसरे की मेमोरी को ओवरराइट करते हैं, जिसके परिणाम

  1. विंडोज प्रदर्शन बढ़ाएं: मेमोरी ऑप्टिमाइज़ेशन और सिस्टम कैश प्रबंधन में महारत हासिल करें विंडोज प्रदर्शन बढ़ाएं: मेमोरी ऑप्टिमाइज़ेशन और सिस्टम कैश प्रबंधन में महारत हासिल करें

    हालांकि विंडोज पीसी को एक उपयोगकर्ता-अनुकूल मशीन के रूप में वर्णित किया जाता है जिसे कुछ टिप्स और ट्रिक्स के साथ कोई भी उपयोग कर सकता है, यह एक जटिल मशीन है। विंडोज पीसी के कई पहलू हैं जिन्हें माइक्रोसॉफ्ट ने आम लोगों से छिपाकर रखा है। ऐसा ही एक पहलू है मेमोरी ऑप्टिमाइज़ेशन और सिस्टम कैश प्रबंधन। मे