2009-05-29 9 views
13

डेवलपर्स .NET में अनजाने संसाधन लीक द्वारा पकड़े जा सकते हैं कई तरीके हैं। मैंने सोचा कि उन्हें एक ही स्थान पर इकट्ठा करना उपयोगी होगा।.NET संसाधन लीक Gotchas

आइटम प्रति एक जवाब के साथ तुम्हारा जोड़ें, तो सबसे अच्छा :)

+1

संबंधित पोस्ट पर निपटान() कॉल करने के लिए विफल: http://stackoverflow.com/questions/20386/memory-leaks-in-net –

+2

इस समुदाय विकी हो नहीं करना चाहिए!?!? –

+2

सीडब्ल्यू पर नहीं - उसे प्रश्न उठाने के लिए पुरस्कृत किया जाना चाहिए। कूल सवाल, बीटीडब्ल्यू। – ine

उत्तर

6

को वोट किया है डेटाबेस कनेक्शन खुला छोड़कर।

4

निपटान करने में विफलता और बच्चे की वस्तुओं का निपटान नहीं करना।

+1

या, इसे कार्यान्वित करना, और उपयोग ब्लॉक में कोड डालना नहीं। –

+1

या निपटान को कार्यान्वित करना, लेकिन एक अंतिमकर्ता को जोड़ना जो निपटान को कॉल करता है। –

0

प्रतिरूपण टोकन हैंडल बाएं खुले हैं।

7

पी/अप्रबंधित कोड के लिए लागू है, और नहीं उन्हें सफाई, या नहीं IDisposable को लागू करने के लिए उन्हें साफ करने के लिए।

8

इवेंट हैंडलर को हटाने में विफलता।

एक घटना के लिए पंजीयन संयुक्त राष्ट्र से पंजीकृत कराने के साथ रखा जाना चाहिए:

this.myObject.MyEvent += new EventHandler(myObject_MyEvent); 
    this.myObject.MyEvent -= new EventHandler(myObject_MyEvent); 

एक प्रणाली है जहाँ इस CodeProject पर हुआ का एक उदाहरण है।

1

सिस्टम पर 'बंद करें' विधि को कॉल करने में विफलता। Windows.Window ऑब्जेक्ट।

एक ही तरीका है सुनिश्चित करने के लिए एक System.Windows.Window वस्तु के लिए सभी प्रबंधित संसाधन हैं कि कचरा एकत्र 'बंद()' विंडो वस्तु पर विधि कॉल करने के लिए है। कॉलिंग ऑब्जेक्ट संदर्भ को निरस्त करने या सेट करने से ऑब्जेक्ट को नष्ट नहीं किया जाएगा।

+0

क्या आप इसके लिए उद्धरण प्रदान कर सकते हैं? –

+0

@ जॉन: यह संसाधन लीक शिकार के दौरान मेरे एक सहयोगी द्वारा पाया गया था, इसलिए मेरे पास प्रकाशित संदर्भ नहीं है। –

1

आप एक "संसाधन" के रूप में कामयाब स्मृति गिनती है - ईवेंट हैंडलर्स घृणाजनक करने में नाकाम रहने मेमोरी लीक (और विभिन्न अन्य अधिक गंभीर कीड़े) की एक आम स्रोत है।

+0

प्रबंधित स्मृति संसाधन नहीं है, लेकिन ईवेंट सदस्यताएं हैं। – supercat

1

स्टेटिक सूचियां, शब्दकोश और संग्रह आधारित संसाधन जो स्टार्ट-अप कोड के बाहर आबादी वाले हैं।

यह तब हो सकता है जब आपके पास एक शब्दकोश है जिसे आप उचित एलआरयू आधारित कैश के बजाय वैश्विक कैश के रूप में उपयोग करते हैं।

कुछ भी स्थिर को बहुत सावधानी बरतनी चाहिए!

2

Office API का उपयोग करते समय बहुत कुछ सब कुछ। चूंकि वे सभी COM ऑब्जेक्ट्स हैं, इसलिए उन्हें निपटान किया जाना चाहिए। यदि आप ईवेंट हैंडलर का उपयोग करना चाहते हैं, तो आपको उन्हें कक्षा संदर्भ भी रखना होगा, अन्यथा वे अपना संदर्भ खो देंगे। मामलों का एक बहुत में, आप भी मैन्युअल क्रम में जीसी कॉल करने के लिए वस्तुओं

4

WCF ग्राहक वस्तुओं अन्य IDisposable वस्तुओं की तरह प्रदर्शन नहीं करते को साफ करने के लिए है। अगर ऑपरेशन एक दोषपूर्ण स्थिति में है या अन्यथा यह कनेक्शन को खुला रखेगा तो डब्लूसीएफ सेवा के ग्राहक को निरस्त किया जाना चाहिए। यह आमतौर पर कठिन तरीका सीखा है।

+0

डब्ल्यूसीएफ ने मुझे हाल ही में इसी तरह के मुद्दे के साथ जला दिया। मैं इसे पोस्ट करूंगा लेकिन इसमें फैक्ट्री पर निपटान करना शामिल है - जो पहचान लागू करता है! –

7

Using का उपयोग नहीं कर रहा है।

2

कमजोर रिसाव का उपयोग करके सूक्ष्म रिसाव हो सकता है जहां वीक रेफरेंस द्वारा आयोजित वस्तु साफ हो जाती है क्योंकि इसमें कोई मजबूत संदर्भ नहीं है लेकिन वीक रेफरेंस स्वयं नहीं है क्योंकि आप इसका मजबूत संदर्भ रखते हैं।

यदि आप वीक रेफरेंस की एक सूची या शब्दकोश की तरह कुछ है जो आप कभी नहीं छेड़छाड़ करते हैं तो आप इसमें भाग सकते हैं। लक्ष्य एकत्र होने के बाद भी आप वीक रेफरेंस ऑब्जेक्ट्स को लीक कर देंगे।

0

.NET कॉम्पैक्ट फ्रेमवर्क पर किसी भी चित्रकारी संबंधित ऑब्जेक्ट्स (ग्राफिक्स, फ़ॉन्ट, सॉलिडब्रश, पेन इत्यादि) का निपटान करने में विफलता। जब आप नहीं चाहते हैं तो यह कुछ गंभीर मेमोरी लीक का कारण बन सकता है (मोबाइल डिवाइस = सीमित मेमोरी)।

1

आसान मेमोरी रिसाव: प्रकार की श्रेणी में एक स्थिर क्षेत्र बनाएं। सूची में आइटम जोड़ें। उन्हें कचरा इकट्ठा नहीं किया जाएगा, इसलिए जब तक आप उनके साथ काम नहीं कर लेते हैं, तब तक याद रखें जब तक आप उनके साथ काम नहीं कर लेते हैं, स्मृति को लगातार बंधे होते हैं।

0

Misconfiguring Spring.NET कुछ है कि एक सिंगलटन होना चाहिए के कई उदाहरण बनाने के लिए।

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