2008-10-22 14 views
27

में मेमोरी लीक्स मैं सी # में मेमोरी लीक के कारण को ट्रैक करने पर कुछ सलाह का उपयोग कर सकता हूं। मैं समझता हूं कि मेमोरी रिसाव क्या है और मुझे लगता है कि वे सी # में क्यों होते हैं, लेकिन मुझे आश्चर्य है कि आप उन्हें हल करने के लिए अतीत में किस टूल/रणनीतियों का इस्तेमाल करते थे?सी # डब्ल्यूपीएफ

मैं .NET मेमोरी प्रोफाइलर का उपयोग कर रहा हूं और मुझे पता चला है कि खिड़की को बंद करने के बाद मेरी बड़ी मुख्य वस्तुएं स्मृति में रह रही हैं, लेकिन मुझे यकीन नहीं है कि इससे सभी लिंक गंभीर हैं।

यदि मैं पर्याप्त स्पष्ट नहीं हूं तो बस एक प्रश्न के साथ उत्तर पोस्ट करें और मैं प्रतिक्रिया में अपना प्रश्न संपादित करूंगा। धन्यवाद! डीबगर में

+0

भी चींटियों मेमोरी प्रोफाइलर कोशिश के रूप में यह डायन एक दिया वस्तु –

उत्तर

39

तोड़ और फिर तत्काल विंडो में इस टाइप करें:

.load C:\Windows\Microsoft.NET\Framework\v2.0.50727\sos.dll 

पथ sos.dll भिन्न होता है। सही पथ का पता लगाने का तरीका मॉड्यूल फलक में mscorwks.dll को देखना है। जहां से लोड किया गया है sos.dll के लिए सही पथ है।

फिर इस टाइप करें:

System.GC.Collect() 

कि कुछ भी पहुंच योग्य नहीं यह सुनिश्चित करेंगे एकत्र किया जाता है। फिर इसे टाइप करें:

!DumpHeap -type <some-type-name> 

यह आपको पते के साथ सभी मौजूदा उदाहरणों की एक तालिका दिखाएगा। आप पता लगा सकते हैं कि क्या इस तरह एक उदाहरण जीवित रखने जाता है:

!gcroot <some-address> 
+0

मैं System.GC.Collect() का उपयोग करने के कचरा संग्रहण काम करने के लिए पाने के लिए था करने के लिए अंक की ऐसी वस्तुएं दिखाएगा। – nash

+0

मुझे लगता है कि यह इस बात पर निर्भर हो सकता है कि जब आप इसे तोड़ते हैं तो डीबगर बंद हो जाता है। मैं अपना जवाब ठीक कर दूंगा ताकि यह परवाह किए बिना काम करता है। –

8

नेट मेमोरी प्रोफाइलर एक उत्कृष्ट उपकरण है, और एक है कि मैं अक्सर उपयोग WPF अनुप्रयोगों में मेमोरी लीक निदान करने के लिए है।

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

किसी प्रकार पर डबल-क्लिक करने के बाद, प्रोफाइलर आपको उस प्रकार की वस्तुओं को जीवित रखने वाले सबसे छोटे रूट पथ दिखाएगा। कई अलग-अलग तरीके हैं जो .NET ऑब्जेक्ट्स WPF में रिसाव कर सकते हैं, इसलिए जो रूट पथ आप देख रहे हैं उसे पोस्ट करना अंतिम कारण की पहचान करने में मदद करेगा। आम तौर पर, हालांकि, यह समझने की कोशिश करें कि वे ऑब्जेक्ट्स आपके ऑब्जेक्ट पर क्यों हैं, और देखें कि खिड़की बंद होने पर आप अपने ईवेंट हैंडलर, बाइंडिंग इत्यादि को अलग कर सकते हैं या नहीं।

मैंने हाल ही में blog entry को एक विशेष memory leak के बारे में पोस्ट किया है जो कुछ बाइंडिंग के कारण हो सकता है; उस विशिष्ट प्रकार के रिसाव के लिए, कोड को बाध्यकारी खोजने के लिए उपयोगी है जो गलती है।

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