.NET फ्रेमवर्क OutOfMemoryException के लिए मेमोरी कैसे आवंटित करता है?


144

सी ++ में वास्तव में एक ढेर पर मेमोरी को आवंटित किए बिना मूल्य द्वारा एक अपवाद को फेंकना संभव है, इसलिए यह स्थिति समझ में आती है। लेकिन .NET फ्रेमवर्क OutOfMemoryExceptionमें एक संदर्भ प्रकार है, इसलिए इसे एक ढेर पर आवंटित किया गया है। OutOfMemoryExceptionजब कोई नया ऑब्जेक्ट बनाने के लिए पर्याप्त मेमोरी नहीं है , तो .NET फ्रेमवर्क मेमोरी को कैसे आवंटित करता है ?


6
बहुत बढ़िया सवाल। शायद पर्याप्त स्मृति केवल उस स्थिति के लिए आरक्षित है।
GreatAndPowerfulOz

19
बस पहले से ही यहां अन्य उत्तरों को जोड़ने के लिए, ध्यान रखें कि OOM का अर्थ है कि आपके द्वारा अनुरोधित ब्लॉक आवंटित नहीं किया जा सकता है। यदि आप 100Mb मांगते हैं और सबसे बड़ा उपलब्ध ब्लॉक रनटाइम पा सकते हैं तो वह केवल 99Mb है, यह विफल हो जाएगा। लेकिन एक OOM अपवाद को केवल कुछ बाइट्स मेमोरी की आवश्यकता होती है। इसलिए सिर्फ इसलिए कि आपका आवंटन विफल हो गया, इसका मतलब यह नहीं है कि शून्य मेमोरी शेष है। लेकिन निश्चित रूप से यह संभावना है कि रनटाइम इस स्थिति में खुद को कवर करने के लिए कुछ मेमोरी रखता है
जेसन विलियम्स

4
C ++ के बारे में आपकी धारणा गलत है। संकलक के आधार पर, अपवाद को ढेर पर आवंटित किया जा सकता है। MS कंपाइलर नहीं करता है, लेकिन आम C ++ ABI में, अपवाद हीप पर आबंटित किए जाते हैं, सिवाय इसके कि एक छोटा सा उपदेशात्मक आपातकालीन बफ़र है जिसका उपयोग इसके बजाय किया जाएगा यदि ढेर पर कोई स्थान नहीं बचा है।
सेबस्टियन रेडल

जवाबों:


163

यह रनटाइम द्वारा प्रचारित किया जाता है। यदि आप किसी भी प्रबंधित प्रक्रिया के ढेर का पता लगाते हैं तो आपको उस अपवाद का एक उदाहरण मिलेगा।

यहाँ हैलो वर्ल्ड ऐप के प्रचारित अपवाद दिए गए हैं:

0:003> !dumpheap -stat -type Exception
Statistics:
      MT    Count    TotalSize Class Name
735f2920        1           84 System.ExecutionEngineException
735f28dc        1           84 System.StackOverflowException
735f2898        1           84 System.OutOfMemoryException
735f2744        1           84 System.Exception
735f2964        2          168 System.Threading.ThreadAbortException

4
लेकिन के निर्माताOutOfMemoryException कहा जाता है।
टिम स्कॉलर

36
रनटाइम को आपके कोड के समान नियमों द्वारा नहीं खेलना है। एक अन्य उदाहरण यह है कि यदि आप फेंकते हैं StackOverflowExceptionतो आप उसे पकड़ सकते हैं, लेकिन यदि रनटाइम उस अपवाद को फेंकता है तो आप उसे नहीं पकड़ सकते (डिफ़ॉल्ट रूप से)।
ब्रायन रासमुसेन

8
सीएलआर के अधिकांश अंतर्निहित तंत्र वास्तव में "सी" और "सी ++" में लिखे गए हैं। तो, यह पूरी तरह से संभव है कि वस्तु "जगह में new'd" या स्मृति अन्यथा हेरफेर की गई है।
GreatAndPowerfulOz

2
@hvd साइड इफेक्ट क्या है? क्या OOM स्टैक ट्रेस देता है? हालाँकि मेरे पास बाकी जानकारी काफी स्थिर है?
जेम्स बैरास

7
क्या होगा यदि एक ही प्रकार के दो अपवादों की आवश्यकता है क्योंकि दो धागे उन्हें एक ही समय में फेंक देते हैं?
ट्रुबेनफुच 11

42

जब रन आउट के अंदर एक आउट-ऑफ-मेमोरी स्थिति होती है, तो इसे थ्रॉओटऑफमेरी कहते हैं । यह अपवाद :: GetOOMException को कॉल करता है , जो स्टैक पर ऑब्जेक्ट का निर्माण करता है और फिर इसे एक सांख्यिकीय-आवंटित वैश्विक उदाहरण में कॉपी करता है, जिसे फिर फेंक दिया जाता है।

यह प्रबंधित अपवाद नहीं है, हालांकि, यह एक C ++ अपवाद है जो ex.h में घोषित किया गया है । सी ++ अपवाद में कामयाब रहे अपवाद में बदल दिए जाते clrex.cpp , जो कोड के लिए विशेष रूप से पूर्व आबंटित फेंक शामिल कामयाब OutOfMemoryException, जो मूल रूप से आवंटित किया गया था और में निर्माण appdomain.cpp

नोट: इनमें से कुछ स्रोत फाइलें बड़ी हैं और यह सिंटैक्स हाइलाइटिंग को लोड करते हुए आपके ब्राउज़र को कई सेकंड के लिए लटका सकती है।

टिम Schmelter दूसरे जवाब पर एक टिप्पणी में जुड़े कॉल साइटों स्मृति से बाहर चल रहे रनटाइम से संबंधित नहीं हैं और एक वस्तु का निर्माण करने में असमर्थ है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.