2010-05-06 11 views
18

अनुकरण कैसे करें OutOfMemory अपवाद को प्रतिरक्षा बनाने के लिए मुझे अपनी परियोजना को दोबारा करने की आवश्यकता है।आउटऑफमेमरी अपवाद

कि पृष्ठभूमि है विशाल अपने प्रोजेक्ट में और एक पैरामीटर मैं अपने कार्यक्रम और अधिक सटीक हो या स्मृति के कम उपयोग करने के लिए कर सकते हैं बदलकर इस्तेमाल किया संग्रह कर रहे हैं ...

ठीक है,। मुझे क्या करना चाहते हैं एक पाश में दिनचर्या को चलाने के लिए है:

  1. डिफ़ॉल्ट पैरामीटर के साथ सबरूटीन्स चलाएँ।
  2. OutOfMemory अपवाद को पकड़ें, पैरामीटर बदलें और इसे फिर से चलाने का प्रयास करें।
  3. द्वितीय बिंदु करें जब तक पैरामीटर अपवाद फेंकने के बिना subroutines चलाने की अनुमति देता है (आमतौर पर, केवल एक ही बदलाव की आवश्यकता होगी)।

अब, मैं इसका परीक्षण करना चाहता हूं। मुझे पता है, कि मैं अपने आप पर OutOfMemory अपवाद फेंक सकता हूं, लेकिन मैं कुछ वास्तविक स्थिति अनुकरण करना चाहता हूं।

तो मुख्य सवाल यह है:
मेरे कार्यक्रम के लिए स्मृति सीमा के कुछ प्रकार की स्थापना करने का एक तरीका है, तक पहुंच गया जो OutOfMemory अपवाद स्वचालित रूप से फेंक दिया जाएगा के बाद?
उदाहरण के लिए, मैं एक सीमा निर्धारित करना चाहूंगा, आइए सिस्टम में उपलब्ध स्मृति की मात्रा होने पर स्थिति को अनुकरण करने के लिए मेरे पूरे कार्यक्रम के लिए 400 एमबी मेमोरी कहें।
क्या यह किया जा सकता है?

उत्तर

2

मैं इस को देखने का एक और तरीका सुझाव देना चाहते हैं। आपको जरूरी नहीं कि स्मृति से बाहर निकलना पड़े। आपको बस इस्तेमाल की गई स्मृति की मात्रा की निगरानी करने की आवश्यकता है, और इसकी तुलना कुल सिस्टम मेमोरी से करें। शायद GC.GetTotalMemory जैसे कुछ यह देखने के लिए यहां उपयोगी होंगे कि आपका एप्लिकेशन कितनी मेमोरी का उपयोग कर रहा है। फिर perhaps this article आपके सिस्टम पर उपलब्ध भौतिक RAM की कुल मात्रा प्राप्त करने में सहायता करेगा।

+0

ठीक है, मुझे सिस्टम मेमोरी के साथ इसकी तुलना करने की आवश्यकता नहीं है, मुझे बस यह जानने की जरूरत है कि मेरे प्रोग्राम का कितना एमबी रैम इस्तेमाल होता है। मुझे जीसी के लिए डॉक्टर पढ़ने की जरूरत है ... धन्यवाद! – Gacek

+0

ठीक है ... ठीक है क्योंकि आप OutOfMemoryException की तलाश में थे, मुझे लगता है कि आप अधिकतम प्रदर्शन के लिए ट्यूनिंग के प्रयोजनों के लिए किसी बिंदु पर भागना चाहते थे। लेकिन हे, अगर जीसी विधियां आपके लिए काम करती हैं, तो शांत! – Dave

+0

अच्छा, मुझे लगता है कि मैं जीसी विधियों का उपयोग कर सकता हूं और कुछ सीमा तक पहुंचने के बाद अपवाद फेंक सकता हूं। शायद कुछ पृष्ठभूमि कार्यकर्ता ... मुझे यह जांचने की ज़रूरत है कि यह काम करेगा या नहीं। – Gacek

5

बस एक बहुत बड़ी सरणी आवंटित करें। एक बार आपका सी # एप्लिकेशन 1.2-1.6 जीबी रैम उपयोग तक पहुंचने के बाद मेमोरी अपवादों से बाहर निकलना शुरू कर देगा (आमतौर पर उस सीमा के निचले हिस्से पर, इसके लक्ष्यीकरण x86 प्रदान किया जाता है)।

+0

ठीक है, लेकिन यह वही है जो मैं स्वयं को आउटऑफमेमरी अपवाद फेंक कर प्राप्त कर सकता हूं। मैं वास्तविक स्थिति का अनुकरण करना चाहता हूं और कुछ छोटे डेटासेट का उपयोग करके इसका परीक्षण करना चाहता हूं (जो कि 1.6 जीबी के बजाय लगभग 400 एमबी रैम का उपभोग करता है) – Gacek

+0

जो 64 बिट पर भरोसेमंद काम नहीं करेगा। – Thorsten79

+0

बेहतर, प्रत्येक 1 जीबी लंबाई के साथ सरणी सरणी बनाना शुरू करें। आप इसे काफी जल्दी से पुन: उत्पन्न करने में सक्षम होंगे। – Nayan

6
public void EatMemory() 
{ 
    List<byte[]> wastedMemory = new List<byte[]>(); 

    while(true) 
    { 
     byte[] buffer = new byte[4096]; // Allocate 4kb 
     wastedMemory.Add(buffer); 
    } 
} 

ज़्यादा समय नहीं लगेगा जब तक आप राम :) की 12GB मिल गया है

+3

ओम नामांकन नाम! विंडोज़ x86 पर 2 जीबी मेमोरी तक एप्लिकेशन को सीमित करता है और मुझे लगता है कि यह 64 बिट पर थोड़ा अधिक है, इसलिए 12 जीबी कोई फर्क नहीं पड़ता। – NibblyPig

+0

दिलचस्प, मैंने उपरोक्त कोड चलाया, और यह मेरे पीसी को अच्छी तरह से खराब कर दिया। विंडोज पूरी तरह उत्तरदायी नहीं हुआ, और आखिर में मैं 3 जीबी मेमोरी का उपयोग कर विजुअल स्टूडियो देखने के लिए टास्क मैनेजर के पास गया। मुझे कोई अपवाद नहीं मिला, और स्मृति उपयोग लगभग 3.1 जीबी तक बढ़ रहा था और फिर 3 जीबी तक कूद रहा था ... मेरे पास 4 जीबी रैम है। – NibblyPig

+0

@ एसएलसी: पेज फ़ाइल शायद आपको इसके खिलाफ सुरक्षित रखती है, जो शायद आपने देखा कि आपका पीसी क्रॉल में धीमा हो गया था। – Dave

16

यह नौकरी की तरह दिखता है ... सिस्टम। रनटाइम.मेमरीफेलपॉइंट

http://msdn.microsoft.com/en-us/library/system.runtime.memoryfailpoint.aspx

मैं कड़ी में उदाहरण आपकी स्थिति के अनुसार लगता है। मेमोरीफ़ेलपॉइंट आपको जो भी स्तर चाहिए, उसे सेट करें और फिर अपर्याप्त मेमरी अपवाद को पकड़ें और तदनुसार इनपुट पैरामीटर समायोजित करें।

+0

ऐसा लगता है कि यह वर्ग मुझे जो चाहिए उसे काफी विपरीत करता है। यह वास्तव में जांचता है कि क्या कुछ मात्रा में मेमोरी उपलब्ध है (उदाहरण के लिए, 'मेमोरीफेलपॉइंट (100)' को कॉल करने से कोई यह जांच सकता है कि 100 एमबी का उपभोग करने वाले ऑपरेशन को निष्पादित किया जा सकता है। मुझे यह जांचना है कि मेरा प्रोग्राम पहले से कितना मेमोरी है। – Gacek

2

आउट-ऑफ-मेमोरी अपवाद अनुकरण करने का एक अच्छा तरीका प्रोग्राम को वर्चुअल मशीन (वीएम) में चलाने के लिए है। आप वर्चुअल मशीन के लिए अधिकतम मेमोरी आवंटन को उस स्तर पर सेट कर सकते हैं जो आपके प्रोग्राम पर मेमोरी प्रेशर बनाने के लिए काफी छोटा है और अपवाद को उकसाता है।

कुछ खुले स्रोत वीएम हैं: QEMU, xen, और kvm। एक अच्छी वाणिज्यिक वर्चुअल मशीन मैक ओएस एक्स या वीएमवेयर प्लेयर के लिए वीएमवेयर फ्यूजन है जो लिनक्स/विंडोज के लिए है।

संबंधित मुद्दे