2012-02-01 24 views
8

एक जटिल बहु आवेदन मैं एक सप्ताह में एक बार हो सकता है एक बाहर के स्मृति अपवाद मार रहा हूँ के अंदर। एप्लिकेशन कई सॉकेट के माध्यम से भारी मात्रा में डेटा भेज रहा/पढ़ रहा है, जहां नेटवर्क कार्ड बफर ओवररन्स से बचने के लिए पढ़ा गया डेटा कैश किया जाता है।
सबसे अच्छी रणनीति स्मृति अपवाद विश्लेषण करने के लिए क्या है? सामान्य चलाने के समय के दौरान, अनुप्रयोग की प्रक्रिया एक्सप्लोरर में 1.5 गीगाबाइट की "सभी ढेर में कुल बाइट" एक आकार के साथ दिखाया गया है।
यह एक धागा जो मतदान या तोसी # स्मृति अपवाद के समाप्त - चेतावनी रणनीति

GC.GetTotalMemory()

या

PrivateMemorySize64()

एक एक बार

है करने के लिए एक रणनीति हो सकता है दूसरी बात यह जानने के लिए कि चीजों का विश्लेषण शुरू करना कब है? मैंने अभी तक वाणिज्यिक प्रोफाइलरों में नहीं देखा है और मैं उनके प्रदर्शन प्रभाव से थोड़ा चिंतित हूं जो वास्तविक समस्या विश्लेषण के संबंध में गलत परिणाम भी दे सकता है।

+1

आपका कैशिंग कैसे काम करता है? मैं आपके कैशिंग के लिए एक अलग आवंटन रणनीति में देखता हूं। – CodesInChaos

+0

स्पष्टीकरण के लिए, क्या आप जानते हैं कि स्मृति अपवाद से क्या कारण बनता है और क्या आप अपने आवेदन में कैशिंग को कॉन्फ़िगर करने के लिए बस एक तरीके से देख रहे हैं ताकि ऐसा न हो? या यह है कि आप नहीं जानते कि वास्तव में इसका क्या कारण है और आप समस्या को डीबग करना चाहते हैं? – svick

उत्तर

3

आपकी मेमोरी शायद कई स्ट्रिंग ऑपरेशंस या अन्य ऑपरेशंस से विभाजित हो रही है जो बॉक्सिंग/अनबॉक्सिंग जैसे स्मृति के छोटे ब्लॉक बनाते हैं और रिलीज़ करते हैं।

आप इस अपवाद है जब CLR स्मृति का एक बड़ा पर्याप्त मुक्त ब्लॉक आवंटित नहीं कर सकता मिल जाएगा।

मैं "CLR प्रोफाइलर" का उपयोग और स्मृति आवंटन की जाँच करें। यदि आप कई सफेद-स्पॉट (फ्री ब्लॉक) और कोई बड़ा फ्री ब्लॉक देखते हैं तो आपको यह देखने की आवश्यकता है कि आप ऑब्जेक्ट्स आवंटित कैसे कर रहे हैं।

उदाहरण के लिए, एक स्ट्रिंग को दूसरे को सौंपने से पहले, यह देखने के लिए जांचें कि तार पहले अलग हैं या नहीं। स्ट्रिंगबिल्डर का उपयोग करना सभी मामलों, मुक्केबाजी को खत्म करने, और अन्य स्मृति अनुकूलन है।

मैं इस तकनीक का उपयोग करता हूं और बाइनरी डी-सीरियलाइजेशन के साथ ज्ञात समस्या को छोड़कर अपवादों को पूरी तरह समाप्त कर देता हूं।

http://msdn.microsoft.com/en-us/magazine/cc163856.aspx

अपने प्रबंधित कोड में मेमोरी अनुकूलन का खोया कला को फिर से देखें मेमोरी मुद्दे जांच http://msdn.microsoft.com/en-us/magazine/cc163528.aspx

प्रदर्शन http://msdn.microsoft.com/en-us/library/aa289513 (V में विजुअल बेसिक .NET में अनुकूलन पर = बनाम 71) .aspx

+2

अधिकांश तारों को स्थानांतरित किया जाना चाहिए, और इस प्रकार स्मृति विखंडन का कारण नहीं बनना चाहिए। LoH विखंडन एक समस्या हो सकती है, लेकिन यदि आप LoH पर समाप्त होने के लिए काफी बड़े स्ट्रिंग का उपयोग कर रहे हैं तो आप शायद कुछ गलत कर रहे हैं। – CodesInChaos

+0

अन्य स्मृति अनुकूलन से आपका क्या मतलब है? एक भाग में मैं भारी विभाजन, रेगेक्स, ढेर और सूचियों का उपयोग कर रहा हूं। मुक्केबाजी – weismat

+0

के लिए पुन: जांच करने की आवश्यकता है यदि पर्याप्त ब्लॉक नहीं है तो आप स्मृति को स्थानांतरित नहीं कर सकते हैं। यही कारण है कि आउट ऑफ़ मेमोरी अपवाद फेंक दिया गया है। मैंने कभी भी LOH को मेमोरी अपवादों के कारण नहीं देखा। यही वह चीज है, एक ढेर मेमोरी के बड़े ब्लॉक को स्मृति के एक बड़े मुक्त निरंतर ब्लॉक को खोजने की आवश्यकता के बिना आवंटित किया जा सकता है। – AMissico

0

कैसे कैशिंग के लिए कमजोर संदर्भों का उपयोग के बारे में? clicky

+3

बस एफवाईआई, यह कमजोर संदर्भ गिल्डलाइन से है: "स्मृति प्रबंधन समस्याओं के स्वचालित समाधान के रूप में कमजोर संदर्भों का उपयोग करने से बचें। इसके बजाय, अपने आवेदन की वस्तुओं को संभालने के लिए एक प्रभावी कैशिंग नीति विकसित करें।" –

+0

ऐसे कई स्थान नहीं हैं जहां कमजोर संदर्भ मदद कर सकते हैं - मुझे लगता है कि मैं उपलब्ध डेटा स्थान को दोगुना करने के लिए प्रक्रिया को दो में विभाजित कर दूंगा। मैंने प्रशासनिक कारणों से अब तक इसे टाला है। – weismat

1

आप और खिड़कियों के लिए डीबगिंग टूल स्थापित करने adplus

ADPlus.vbs (ADPlus) Microsoft उत्पाद समर्थन सेवा (PSS) है कि किसी भी प्रक्रिया या अनुप्रयोग को बंद हो जाता है निवारण कर सकते हैं से एक उपकरण है विचार कर सकते हैं जवाब देना (लटकता है) या विफल रहता है (क्रैश)।

मूल रूप से, आप सेट कर सकते हैं आवेदन देख कि, और जब यह दुर्घटनाओं, यह एक डंप पर कब्जा होगा, कि आप तो WinDBG/एसओएस का उपयोग कर विश्लेषण कर सकते हैं।

+0

मैं इस मार्ग पर जा सकता हूं - मुझे लगता है कि मैं इसे अपनी शेड्यूल की गई कार्य सूची में जोड़ दूंगा, ताकि यह रोज़ाना शुरू हो सके क्योंकि हर दिन एक नई शुरुआत की आवश्यकता होगी (जैसे .exe दैनिक भी शुरू होता है)। – weismat

1

आप एक MemoryFailPoint का उपयोग कोशिश करते हैं और किसी दिए गए आपरेशन

पर आप कुछ की गारंटी देता है देने के लिए कर सकते हैं लेकिन मैं प्रक्रिया आप अपने ऐप्लिकेशन में चल रहा है अलग सलाह देते हैं, 64 बिट में जाने कि अगर एक विकल्प है और आप की आवश्यकता हो सकती आपको अपने मेमोरी उपयोग की उचित गारंटी देने के लिए कुछ प्रदर्शन को कम करने पर विचार करें।