2011-04-22 12 views
10

मैं अपने डब्ल्यूपीएफ आवेदन में कुछ मेमोरी लीक को हल कर रहा हूं। ऐसा करने के लिए, मैंने सीएलआर प्रोफाइलर का उपयोग किया, साथ ही साथ विंडोज टास्क मैनेजर में प्रोसेस आंकड़े देखे। मेरा मूल परीक्षण यह सुनिश्चित करना था कि जब एक निश्चित विंडो बंद हो गई, तो यह अभी भी स्मृति में चारों ओर लटका नहीं था।क्या मुझे कभी भी अपने डब्ल्यूपीएफ ऐप में कचरा संग्रह को मजबूर करना चाहिए?

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

लेकिन मुझे यह सोचने लगा - क्या कभी कचरा संग्रह को मैन्युअल रूप से मजबूर करने की आवश्यकता है?

यह मुझे अपने एप्लिकेशन की मेमोरी खपत को ऊपर और ऊपर देखने के लिए परेशान करता है क्योंकि मैं विंडोज़ खोलता हूं और बंद करता हूं। बेशक, अंत में, कचरा संग्रह स्वचालित रूप से चलता है और यह सब हल हो जाता है। लेकिन ये भारी खिड़कियां बंद होने के बाद मैन्युअल रूप से कचरा इकट्ठा करने के लिए एक अच्छा विचार लगता है। लेकिन क्या कोई बात है? मुझे लगता है कि एक तरफ परीक्षण करना, हमें कचरा संग्रह को मजबूर नहीं करना चाहिए - बस सिस्टम को इसे हल करने दें।

विचारों की सराहना की।

उत्तर

9

प्रतिक्रिया लोगों के लिए धन्यवाद। मैं आपकी सलाह के साथ जाऊंगा और प्रणाली को ध्यान में रखूंगा कि सिस्टम की देखभाल करने के लिए किस प्रणाली को डिजाइन किया गया था!

मुझे वास्तव में .NET ढांचे पर एक पुस्तक में मेरे प्रश्न का एक अच्छा जवाब मिला है।इसे कहते हैं:

नेट कचरा कलेक्टर का पूरा उद्देश्य हमारे ओर से स्मृति का प्रबंधन करने के लिए है। हालांकि, कुछ दुर्लभ परिस्थितियों में, प्रोग्रामिंग रूप से GC.Collect() का उपयोग करके एक कचरा संग्रह को लागू करने के लिए फायदेमंद हो सकता है। विशेष रूप से:

  • जब आपके आवेदन के बारे में कोड का एक खंड है कि आप एक संभव कचरा संग्रह से बाधित नहीं चाहते में प्रवेश करने की है।
  • आपके आवेदन सिर्फ वस्तुओं की एक अत्यंत बड़ी संख्या आवंटन हो गया है और जल्द से जल्द हासिल कर ली स्मृति के रूप में ज्यादा निकालना चाहते हैं।
5

यह एक अच्छा अभ्यास है किसी भी .NET अनुप्रयोग में मैन्युअल रूप से कचरा संग्रह को मजबूर नहीं करता है। जीसी हमारे से सबसे बुद्धिमान होना चाहिए (और वास्तव में यह स्मार्ट है)। दुर्भाग्यवश यदि स्मृति रिसाव है, तो जबरन कॉलिंग भी जीसी मदद नहीं करता है।

+1

+1 के लिए 'अगर कोई स्मृति रिसाव है, यहां तक ​​कि फोन करने जबरन जीसी मदद नहीं करता है "। यह एक बहुत अच्छा मुद्दा है ... लीक ऑब्जेक्ट कचरा संग्रह के लिए उम्मीदवार नहीं हैं। – NateTheGreat

3

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

मैंने कुछ उदाहरण देखे हैं जहां लोग सोचा वे कचरे के संग्रह को मजबूर कर अच्छा कर रहे थे, लेकिन इससे कोई कठोर सबूत नहीं था कि इससे मदद मिली।

2

जीसी.कोलेक्ट का उपयोग करने का एकमात्र समय यह पता लगाना है कि कितनी मेमोरी एकत्र करने के लिए तैयार है।

अन्यथा यह बेकार है क्योंकि अब तक जीसी मुझसे ज्यादा चालाक है।

0

जबकि मैन्युअल बुला GC.Collect बेकार है, तो आप मैन्युअल बड़ा वस्तुओं पर Dispose कॉल कर सकते हैं जब आप जानते हैं कि आप उनके साथ काम हो गया है, तो भले ही आप बिना किसी कारण के अपने कोड में उन्हें संदर्भ रोक रखी है (खराब), कम से कम उनके विनाशक को बुलाया जाता है और (यदि उपर्युक्त स्लॉपी कोड से बेहतर लिखा गया है) वास्तव में बहुत अधिक स्मृति पर कब्जा नहीं करना चाहिए।

2

मुझे विश्वास है कि आपको यह लेख पढ़ना चाहिए: Secrets of WPF Memory Allocation। यह आपके प्रश्न के बारे में बिल्कुल नहीं है, लेकिन WPF व्यवहार को समझने के लिए मूल्यवान है।

+0

+1 दिलचस्प लेख। –

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