2010-10-21 11 views
8

में वृद्धि होगी मैं WinForm एप्लिकेशन के स्मृति उपयोग को कम करने की कोशिश कर रहा हूं।बस खुले और बंद करें संवाद Winform स्मृति उपयोग

आवेदन में एक मुख्य रूप और एक सेटिंग फॉर्म है। जब "सेटिंग" बटन दबाया गया था, तो सेटिंग फ़ॉर्म एक मोडल फॉर्म के रूप में पॉपअप करेगा, सेटिंग फ़ॉर्म APP.config डेटा को कॉन्फ़िगरेशन फ़ाइल से लोड करेगा और उन्हें हैशटेबल के रूप में स्मृति में पढ़ेगा। सेटिंग फॉर्म बंद होने के बाद, यह Windows.Forms.Form से निहित विधि को कॉल करेगा। निपटान विधि हैशटेबल्स और app.config ऑब्जेक्ट को शून्य पर सेट करने के समान सरल है। modalform रूप

दिखाएँ SettingForm:

private void btnSettings_Click(object sender, EventArgs e) 
    { 
     frmConfig form = new frmConfig(); 
     form.StartPosition = FormStartPosition.CenterScreen; 
     //MessageBox.Show(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)); 
     form.ShowDialog(this); 
     form.Dispose(); 
    } 

निपटान विधि:

protected override void Dispose(bool disposing) 
    { 
     if (disposing && (components != null)) 
     { 
      components.Dispose(); 
      // Release managed resources 
      Logger.Verbose("Disposing SettingForm"); 
      mySetting = null; 
      testFtp = null; 
     } 
     base.Dispose(disposing); 
    } 

नोट: mySetting सभी app.config Hashtable में लोड किया गया डेटा के साथ कक्षा का एक उदाहरण है, और testFtp ftp फ़ंक्शन के लिए एक कस्टम ऑब्जेक्ट है। मैं इस दो वर्ग के लिए निपटान विधि को लागू करने और

mySetting.Dispose(); 
testFtp.Dispose(); 

का उपयोग कर के बजाय उन्हें सेट शून्य पर करना चाहिए, के रूप में वे themself/अप्रबंधित संसाधनों के साथ सौदा कर रहे हैं?

लेकिन प्रत्येक बार "सेटिंग" बटन दबाएं और सेटिंग फॉर्म को बंद करें कुछ सैकड़ों के लिए निजी बाइट बढ़ाएगा मेमोरी लीक? मैं इससे कैसे छुटकारा पा सकता हूं?

+1

यदि आप कम से कम अपने कुछ कोड पोस्ट करते हैं, तो यह मदद करेगा, विशेष रूप से वह कोड जहां आप सामान्य रूप से फॉर्म दिखाते हैं और सेटिंग फ़ॉर्म से आपकी पूरी निपटान विधि दिखाते हैं। – MusiGenesis

+0

इसके अलावा, एक साधारण लॉगिंग या डीबग.प्रिंट कॉल या निपटान विधि के अंदर जो भी हो, यह पुष्टि करेगा कि वास्तव में इसे कभी भी बुलाया जा रहा है या नहीं। – MusiGenesis

+1

'null' के संदर्भ को सेट करना स्मृति को मुक्त नहीं करता है। –

उत्तर

1

जैसा कि आपने अपने प्रश्न के अंत के बारे में सुझाव दिया है, मैं mySetting और testFtp पर IDISposable लागू करने की अनुशंसा करता हूं। आप संसाधनों के बेहतर सफाई एक बार आप लागू कर दिया है निम्नलिखित देखना चाहिए:

protected override void Dispose(bool disposing) { 
    if (disposing && (components != null)) { 
     components.Dispose(); 

     // Release managed resources 
     Logger.Verbose("Disposing SettingForm"); 
     mySetting.Dispose(); 
     testFtp.Dispose(); 
    } 

    base.Dispose(disposing); 
} 

छोटे संपादित करें: नयन के जवाब और जवाब वह के लिए लिंक के आधार पर: मैं अत्यधिक IDisposable के कार्यान्वयन की सलाह देते हैं। Forms का उपयोग करके और Forms कक्षा से चिल्लाते हुए, "IDisposable को लागू करने की आवश्यकता के लिए जांचें।" इसका मतलब यह नहीं है कि आपका कोड इसे कार्यान्वित करना चाहिए, बस आपको यह सुनिश्चित करने के लिए जांच करनी चाहिए कि आपको इसकी आवश्यकता नहीं है। प्रपत्रों में आमतौर पर बहुत सी घटनाएं प्रकाशित होती हैं और सदस्यता ली जाती हैं। एक पकड़-सभी संसाधन बाल्टी, आईएमओ बनने के लिए प्रपत्र भी कुख्यात हैं।

+0

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

1

स्मृति के कुछ अन्य टुकड़ों के कारण भी स्मृति जारी नहीं हो सकती है। चूंकि आपने अधिक जानकारी प्रदान नहीं की है, इसलिए मैं अभी यह मान लेगा कि बाकी सब कुछ इष्टतम है।

जिन वस्तुओं के साथ आप काम कर रहे हैं वे कचरा कलेक्टर द्वारा एकत्र किए जाते हैं (जैसा कि आप जानते हैं)। लेकिन जब आप चाहें तो स्मृति से उन्हें रिहा नहीं किया जा सकता है। .NET ऑब्जेक्ट्स कचरा कलेक्टर के लिए बेहतर छोड़ दिया जाता है।

क्यों स्मृति जारी किया गया हो रही नहीं हो सकता है के अनुसार, you have the answers here.

अशक्त करने के लिए ऑब्जेक्ट संदर्भ सेट करना ज्यादा फर्क नहीं है। दूसरी तरफ, मैंने व्यक्तिगत रूप से कुछ बार रिकॉर्ड किया है, वस्तुओं को जीवित वापस आ रहा है (और पुरानी पीढ़ियों तक धकेल दिया गया है) क्योंकि आप उनका उपयोग कर रहे हैं, जबकि शून्य को सेट करते समय। यह जीसी के साथ हस्तक्षेप का एक और रूप है, लेकिन आपकी पसंद है।

आपको IDisposable को लागू करने की आवश्यकता नहीं हो सकती है, लेकिन यदि आप धाराओं, ओएस हैंडल, अप्रबंधित संसाधनों के साथ काम कर रहे हैं, तो आपको तब चाहिए।

संपादित करें:

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

+0

इस आलेख के अनुसार, मैंने पाया कि यह मेरे द्वारा नौसिखिया के लिए बहुत उपयोगी है, http://www.dotnetfunda.com/articles/article625-best-practices-no-5--detecting-net-plication- स्मृति -लेक्स-.aspx निजी बाइट मेमोरी उपयोग में लगातार वृद्धि एक अप्रबंधित संसाधन रिसाव को इंगित करती है, उस स्थिति में मुझे यह सुनिश्चित करना होगा कि वे ठीक तरह से रिलीज़ हो जाएं, जिसका मतलब है कि मुझे लगता है कि मुझे लगता है कि मुझे लगता है कि मुझे किस तरह से पहचानने योग्य है? –

+0

यह एक अच्छा लेख है जिसे मैंने याद किया। उसके लिए धन्यवाद! ठीक है, अगर आप "जानते हैं" कि यह अप्रबंधित स्मृति रिसाव है, तो उन स्थानों को ढूंढें जहां अप्रबंधित स्मृति आवंटित हो रही है। आप 'आईडीस्पोजेबल' इंटरफ़ेस को कार्यान्वित कर सकते हैं और ऑब्जेक्ट के अप्रबंधित सदस्यों को छोड़ सकते हैं। लेकिन यह भी सुनिश्चित करें कि जिनके दायरे इस तरह के कार्य तक सीमित हैं, वे भी स्मृति जारी कर रहे हैं। उन्हें निपटान विधि में मुक्त नहीं किया जा सकता है। उदाहरण के लिए: किसी फ़ंक्शन में स्ट्रीम बंद करना - इसे केवल उस फ़ंक्शन में ही नियंत्रित किया जा सकता है! शुभकामनाएं! – Nayan

0

आपको लगता है कि यह एक रिसाव क्यों है? जीसी तुरंत स्मृति मुक्त करने के लिए बाध्य नहीं है, कुछ परिस्थितियों में यह वास्तव में संग्रह कभी नहीं कर सकता है और यह ठीक होगा।

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

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